Alerte de live

This commit is contained in:
Kepka Ludovic
2025-08-30 11:42:35 +02:00
parent 69edfd4771
commit 5c96a8a18a
6 changed files with 58 additions and 14 deletions

View File

@@ -21,7 +21,8 @@ class GameBundle(db.Model):
class LiveAlert(db.Model): class LiveAlert(db.Model):
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
enable = db.Column(db.Boolean, default=False) enable = db.Column(db.Boolean, default=True)
online = db.Column(db.Boolean, default=False)
login = db.Column(db.String(128)) login = db.Column(db.String(128))
notify_channel = db.Column(db.Integer) notify_channel = db.Column(db.Integer)
message = db.Column(db.String(2000)) message = db.Column(db.String(2000))

View File

@@ -25,6 +25,7 @@ CREATE TABLE IF NOT EXISTS `humeur` (
CREATE TABLE IF NOT EXISTS live_alert ( CREATE TABLE IF NOT EXISTS live_alert (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
`enable` BOOLEAN NOT NULL DEFAULT TRUE, `enable` BOOLEAN NOT NULL DEFAULT TRUE,
`online` BOOLEAN NOT NULL DEFAULT FALSE,
`login` VARCHAR(128) UNIQUE NOT NULL, `login` VARCHAR(128) UNIQUE NOT NULL,
`notify_channel` INTEGER NOT NULL, `notify_channel` INTEGER NOT NULL,
`message` VARCHAR(2000) NOT NULL `message` VARCHAR(2000) NOT NULL

View File

@@ -7,7 +7,7 @@ from twitchAPI.type import AuthScope, ChatEvent
from twitchAPI.chat import Chat, ChatEvent, ChatMessage, EventData from twitchAPI.chat import Chat, ChatEvent, ChatMessage, EventData
from database.helpers import ConfigurationHelper from database.helpers import ConfigurationHelper
from twitchbot.live_alert import checkOnlineStreamer
from webapp import webapp from webapp import webapp
USER_SCOPE = [AuthScope.CHAT_READ, AuthScope.CHAT_EDIT] USER_SCOPE = [AuthScope.CHAT_READ, AuthScope.CHAT_EDIT]
@@ -53,14 +53,13 @@ class TwitchBot() :
async def _checkOnlineStreamers(self): async def _checkOnlineStreamers(self):
# pas bon faudrait faire un truc mieux # pas bon faudrait faire un truc mieux
while True : while True :
async for stream in self.twitch.get_streams(user_login=['chainesteve']): try:
print(stream.user_id) await checkOnlineStreamer(self.twitch)
except Exception as e:
logging.error(f'Erreur lors lors du check des streamers online : {e}')
# toutes les 5 minutes # toutes les 5 minutes
await asyncio.sleep(5*60) await asyncio.sleep(5*60)
def begin(self): def begin(self):
asyncio.run(self._connect()) asyncio.run(self._connect())

36
twitchbot/live_alert.py Normal file
View File

@@ -0,0 +1,36 @@
from twitchAPI.twitch import Twitch
from twitchAPI.object.api import Stream
from database import db
from database.models import LiveAlert
from discordbot import bot
from webapp import webapp
async def checkOnlineStreamer(twitch: Twitch) :
with webapp.app_context() :
alerts : list[LiveAlert] = LiveAlert.query.filter_by(enable = True).all()
streams = await _retreiveStreams(twitch, alerts)
for alert in alerts :
stream = next((s for s in streams if s.user_login == alert.login), None)
if stream :
if not alert.online :
await _notifyAlert(alert, stream)
alert.online = True
else :
alert.online = False
db.session.commit()
async def _notifyAlert(alert : LiveAlert, stream : Stream):
message : str = alert.message.format(stream)
bot.loop.create_task(_sendMessage(alert.notify_channel, message))
async def _sendMessage(channel : int, message : str) :
await bot.get_channel(channel).send(message)
async def _retreiveStreams(twitch: Twitch, alerts : list[LiveAlert]) -> list[Stream] :
streams : list[Stream] = []
async for stream in twitch.get_streams(user_login = [alert.login for alert in alerts]):
streams.append(stream)
return streams

View File

@@ -7,9 +7,11 @@ table td {
text-align: left; text-align: left;
vertical-align: top; vertical-align: top;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis;
white-space: normal; white-space: normal;
max-width: 250px; }
table.live-alert tr td:last-child {
white-space: nowrap;
} }
a.icon { a.icon {

View File

@@ -5,13 +5,12 @@
{% if not alert %} {% if not alert %}
<h2>Alertes</h2> <h2>Alertes</h2>
<table> <table class="live-alert">
<thead> <thead>
<tr> <tr>
<th>Chaine</th> <th>Chaine</th>
<th>Canal</th> <th>Canal</th>
<th>Message</th> <th>Message</th>
<th>Actif</th>
<th>#</th> <th>#</th>
</tr> </tr>
</thead> </thead>
@@ -23,8 +22,6 @@
<td>{{alert.message}}</td> <td>{{alert.message}}</td>
<td> <td>
<a href="{{ url_for('toggleLiveAlert', id = alert.id) }}" class="icon">{{ '✅' if alert.enable else '❌' }}</a> <a href="{{ url_for('toggleLiveAlert', id = alert.id) }}" class="icon">{{ '✅' if alert.enable else '❌' }}</a>
</td>
<td>
<a href="{{ url_for('openEditLiveAlert', id = alert.id) }}" class="icon"></a> <a href="{{ url_for('openEditLiveAlert', id = alert.id) }}" class="icon"></a>
<a href="{{ url_for('delLiveAlert', id = alert.id) }}" <a href="{{ url_for('delLiveAlert', id = alert.id) }}"
onclick="return confirm('Êtes-vous sûr de vouloir supprimer cette alerte ?')" class="icon">🗑</a> onclick="return confirm('Êtes-vous sûr de vouloir supprimer cette alerte ?')" class="icon">🗑</a>
@@ -53,7 +50,15 @@
La chaine est le login de la chaine, par exemple <strong>chainesteve</strong> pour <strong>https://www.twitch.tv/chainesteve</strong>. La chaine est le login de la chaine, par exemple <strong>chainesteve</strong> pour <strong>https://www.twitch.tv/chainesteve</strong>.
</p> </p>
<p> <p>
Pour le message vous avez acces à ces variables : <strong>TODO</strong> Pour le message vous avez acces à ces variables :
<ul>
<li>{0.user_login}</li>
<li>{0.user_name}</li>
<li>{0.game_name}</li>
<li>{0.title}</li>
<li>{0.language}</li>
<li>{0.thumbnail_url}</li>
</ul>
</p> </p>
</form> </form>