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):
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))
notify_channel = db.Column(db.Integer)
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 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
`enable` BOOLEAN NOT NULL DEFAULT TRUE,
`online` BOOLEAN NOT NULL DEFAULT FALSE,
`login` VARCHAR(128) UNIQUE NOT NULL,
`notify_channel` INTEGER 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 database.helpers import ConfigurationHelper
from twitchbot.live_alert import checkOnlineStreamer
from webapp import webapp
USER_SCOPE = [AuthScope.CHAT_READ, AuthScope.CHAT_EDIT]
@@ -53,14 +53,13 @@ class TwitchBot() :
async def _checkOnlineStreamers(self):
# pas bon faudrait faire un truc mieux
while True :
async for stream in self.twitch.get_streams(user_login=['chainesteve']):
print(stream.user_id)
try:
await checkOnlineStreamer(self.twitch)
except Exception as e:
logging.error(f'Erreur lors lors du check des streamers online : {e}')
# toutes les 5 minutes
await asyncio.sleep(5*60)
def begin(self):
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;
vertical-align: top;
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
max-width: 250px;
}
table.live-alert tr td:last-child {
white-space: nowrap;
}
a.icon {

View File

@@ -5,13 +5,12 @@
{% if not alert %}
<h2>Alertes</h2>
<table>
<table class="live-alert">
<thead>
<tr>
<th>Chaine</th>
<th>Canal</th>
<th>Message</th>
<th>Actif</th>
<th>#</th>
</tr>
</thead>
@@ -23,8 +22,6 @@
<td>{{alert.message}}</td>
<td>
<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('delLiveAlert', id = alert.id) }}"
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>.
</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>
</form>