Author SHA1 Message Date
lili acbc93bedd auto-refresh base
untested
2024-02-04 11:31:42 +01:00
6 changed files with 80 additions and 20 deletions
+8
View File
@@ -2,9 +2,12 @@ import os
import logging import logging
from flask import Flask from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetime
from tlapbot.db import get_db from tlapbot.db import get_db
from tlapbot.owncast_requests import is_stream_live, give_points_to_chat from tlapbot.owncast_requests import is_stream_live, give_points_to_chat
from tlapbot.redeems import remove_inactive_redeems from tlapbot.redeems import remove_inactive_redeems
from tlapbot.helpers import (get_last_online_time, delete_last_online_time,
save_last_online_time)
def create_app(test_config=None): def create_app(test_config=None):
app = Flask(__name__, instance_relative_config=True) app = Flask(__name__, instance_relative_config=True)
@@ -56,9 +59,14 @@ def create_app(test_config=None):
def proxy_job(): def proxy_job():
with app.app_context(): with app.app_context():
if is_stream_live(): if is_stream_live():
if get_last_online_time:
delete_last_online_time()
app.logger.info("Stream is LIVE. Giving points to chat.") app.logger.info("Stream is LIVE. Giving points to chat.")
give_points_to_chat(get_db()) give_points_to_chat(get_db())
else: else:
if not get_last_online_time:
# TODO: error state
save_last_online_time(get_db(), datetime.now(), False)
app.logger.info("Stream is NOT LIVE. (Not giving points to chat.)") app.logger.info("Stream is NOT LIVE. (Not giving points to chat.)")
# start scheduler that will give points to users # start scheduler that will give points to users
+9 -9
View File
@@ -4,20 +4,20 @@ from tlapbot.owncast_requests import send_chat
def send_help(): def send_help():
message = [] message = []
message.append("Tlapbot gives you points for being in chat, and then allows you to spend those points. <br> \n") message.append("Tlapbot gives you points for being in chat, and then allows you to spend those points.\n")
message.append(f"People connected to chat receive {current_app.config['POINTS_AMOUNT_GIVEN']} points every {current_app.config['POINTS_CYCLE_TIME']} seconds. <br> \n") message.append(f"People connected to chat receive {current_app.config['POINTS_AMOUNT_GIVEN']} points every {current_app.config['POINTS_CYCLE_TIME']} seconds.\n")
message.append("You can see your points and recent redeems in the Tlapbot dashboard. Look for a button to click under the stream window. <br> \n") message.append("You can see your points and recent redeems in the Tlapbot dashboard. Look for a button to click under the stream window.\n")
message.append("""Tlapbot commands: <br> message.append("""Tlapbot commands:
!help to see this help message. <br> !help to see this help message.
!points to see your points. <br> \n""" !points to see your points.\n"""
) )
if current_app.config['LIST_REDEEMS']: if current_app.config['LIST_REDEEMS']:
message.append("Active redeems: <br> \n") message.append("Active redeems:\n")
for redeem, redeem_info in current_app.config['REDEEMS'].items(): for redeem, redeem_info in current_app.config['REDEEMS'].items():
if 'info' in redeem_info: if 'info' in redeem_info:
message.append(f"!{redeem} for {redeem_info['price']} points. {redeem_info['info']} <br> \n") message.append(f"!{redeem} for {redeem_info['price']} points. {redeem_info['info']}\n")
else: else:
message.append(f"!{redeem} for {redeem_info['price']} points. <br> \n") message.append(f"!{redeem} for {redeem_info['price']} points.\n")
else: else:
message.append("Check the dashboard for a list of currently active redeems.") message.append("Check the dashboard for a list of currently active redeems.")
send_chat(''.join(message)) send_chat(''.join(message))
+31 -1
View File
@@ -95,6 +95,37 @@ def add_user_to_database(db, user_id, display_name):
current_app.logger.error(f"To user id: {user_id}, with display name: {display_name}") current_app.logger.error(f"To user id: {user_id}, with display name: {display_name}")
def save_last_online_time(db, timestamp, from_owncast):
try:
db.execute(
"INSERT OVERWRITE last_online_time(id, last_online_time, from_owncast)",
(1, timestamp, from_owncast)
)
db.commit()
except Error as e:
current_app.logger.error(f"Error occured saving last online time: {e.args[0]}")
current_app.logger.error(f"Timestamp: {timestamp}, from_owncast: {from_owncast}")
def get_last_online_time(db):
try:
cursor = db.execute(
"SELECT last_online_time FROM last_online_time WHERE id = 1"
)
last_online_time = cursor.fetchone()
return last_online_time
except Error as e:
current_app.logger.error(f"Error occured reading last online time: {e.args[0]}")
def delete_last_online_time(db):
try:
db.execute("DELETE FROM last_online_time")
db.commit()
except Error as e:
current_app.logger.error(f"Error occured deleting last online time: {e.args[0]}")
def change_display_name(db, user_id, new_name): def change_display_name(db, user_id, new_name):
try: try:
cursor = db.execute( cursor = db.execute(
@@ -121,7 +152,6 @@ def remove_duplicate_usernames(db, user_id, username):
# # # misc. stuff # # # # # # misc. stuff # # #
# This is now unused since rawBody attribute of the webhook now returns cleaned-up emotes.
def remove_emoji(message): def remove_emoji(message):
return sub( return sub(
r'<img class="emoji" alt="(:.*?:)" title=":.*?:" src="/img/emoji/.*?">', r'<img class="emoji" alt="(:.*?:)" title=":.*?:" src="/img/emoji/.*?">',
+25 -8
View File
@@ -1,11 +1,13 @@
from flask import Flask, request, json, Blueprint, current_app from flask import Flask, request, json, Blueprint, current_app
from tlapbot.db import get_db from datetime import datetime
from tlapbot.db import get_db, refresh_counters, clear_redeem_queue
from tlapbot.owncast_requests import send_chat from tlapbot.owncast_requests import send_chat
from tlapbot.owncast_helpers import (add_user_to_database, change_display_name, from tlapbot.owncast_helpers import (add_user_to_database, change_display_name,
read_users_points, remove_duplicate_usernames) read_users_points, remove_duplicate_usernames, get_last_online_time, delete_last_online_time)
from tlapbot.help_message import send_help from tlapbot.help_message import send_help
from tlapbot.redeems_handler import handle_redeem from tlapbot.redeems_handler import handle_redeem
# might need datetime timestamp
bp = Blueprint('owncast_webhooks', __name__) bp = Blueprint('owncast_webhooks', __name__)
@@ -15,6 +17,22 @@ def owncast_webhook():
data = request.json data = request.json
db = get_db() db = get_db()
if data["type"] == "STREAM_STARTED":
# TODO: make this a function, import here and in init
delete_last_online_time(db)
last_online = get_last_online_time(db)
if last_online and current_app.config['AUTO_REFRESH']:
time_difference = datetime.now() - last_online
if time_difference.seconds//60 > current_app.config['RECONNECT_TIME']:
if refresh_counters() and clear_redeem_queue():
current_app.logger.debug(f'Counters refreshed, redeem queue cleared.')
else:
current_app.logger.error(
f'Error occured when automatically clearing queue and resetting counters.'
)
elif data["type"] == "STREAM_STOPPED":
save_last_online_time(db, datetime.now(), True)
# Make sure user is in db before doing anything else. # Make sure user is in db before doing anything else.
if data["type"] in ["CHAT", "NAME_CHANGED", "USER_JOINED"]: if data["type"] in ["CHAT", "NAME_CHANGED", "USER_JOINED"]:
user_id = data["eventData"]["user"]["id"] user_id = data["eventData"]["user"]["id"]
@@ -36,23 +54,22 @@ def owncast_webhook():
user_id = data["eventData"]["user"]["id"] user_id = data["eventData"]["user"]["id"]
display_name = data["eventData"]["user"]["displayName"] display_name = data["eventData"]["user"]["displayName"]
current_app.logger.debug(f'New chat message from {display_name}:') current_app.logger.debug(f'New chat message from {display_name}:')
current_app.logger.debug(f'{data["eventData"]["rawBody"]}')
current_app.logger.debug(f'{data["eventData"]["body"]}') current_app.logger.debug(f'{data["eventData"]["body"]}')
if data["eventData"]["rawBody"].startswith(f"{prefix}help"): if data["eventData"]["body"].startswith(f"{prefix}help"):
send_help() send_help()
elif data["eventData"]["rawBody"].startswith(f"{prefix}points"): elif data["eventData"]["body"].startswith(f"{prefix}points"):
points = read_users_points(db, user_id) points = read_users_points(db, user_id)
if points is None: if points is None:
send_chat("Error reading points.") send_chat("Error reading points.")
else: else:
send_chat(f"{display_name}'s points: {points}") send_chat(f"{display_name}'s points: {points}")
elif data["eventData"]["rawBody"].startswith(f"{prefix}name_update"): elif data["eventData"]["body"].startswith(f"{prefix}name_update"):
# Forces name update in case bot didn't catch the NAME_CHANGE # Forces name update in case bot didn't catch the NAME_CHANGE
# event. Also removes saved usernames from users with same name # event. Also removes saved usernames from users with same name
# if user is authenticated. # if user is authenticated.
change_display_name(db, user_id, display_name) change_display_name(db, user_id, display_name)
if data["eventData"]["user"]["authenticated"]: if data["eventData"]["user"]["authenticated"]:
remove_duplicate_usernames(db, user_id, display_name) remove_duplicate_usernames(db, user_id, display_name)
elif data["eventData"]["rawBody"].startswith(prefix): elif data["eventData"]["body"].startswith(prefix):
handle_redeem(data["eventData"]["rawBody"], user_id) handle_redeem(data["eventData"]["body"], user_id)
return data return data
+2 -2
View File
@@ -3,7 +3,7 @@ from tlapbot.db import get_db
from tlapbot.owncast_requests import send_chat from tlapbot.owncast_requests import send_chat
from tlapbot.redeems import (add_to_redeem_queue, add_to_counter, add_to_milestone, from tlapbot.redeems import (add_to_redeem_queue, add_to_counter, add_to_milestone,
check_apply_milestone_completion, milestone_complete, is_redeem_active) check_apply_milestone_completion, milestone_complete, is_redeem_active)
from tlapbot.owncast_helpers import use_points, read_users_points from tlapbot.owncast_helpers import use_points, read_users_points, remove_emoji
def handle_redeem(message, user_id): def handle_redeem(message, user_id):
@@ -64,7 +64,7 @@ def handle_redeem(message, user_id):
if not note: if not note:
send_chat(f"Cannot redeem {redeem}, no note included.") send_chat(f"Cannot redeem {redeem}, no note included.")
return return
if (add_to_redeem_queue(db, user_id, redeem, note) and if (add_to_redeem_queue(db, user_id, redeem, remove_emoji(note)) and
use_points(db, user_id, price)): use_points(db, user_id, price)):
send_chat(f"{redeem} redeemed for {price} points.") send_chat(f"{redeem} redeemed for {price} points.")
else: else:
+5
View File
@@ -30,3 +30,8 @@ CREATE TABLE redeem_queue (
note TEXT, note TEXT,
FOREIGN KEY (redeemer_id) REFERENCES points (id) FOREIGN KEY (redeemer_id) REFERENCES points (id)
); );
CREATE TABLE online_time(
id INTEGER PRIMARY KEY,
online_time TIMESTAMP NOT NULL
);