9 Commits
Author SHA1 Message Date
lili e65ffae8ce promote 1.0.1alpha to 1.0.1 2022-12-07 11:14:33 +01:00
lili c6d94f9d5f version 1.0.1alpha for my next stream 2022-12-05 16:06:39 +01:00
lili bafa1eca16 fix behavior with 2 commands + new user crashes
issue #5
crash i discovered when testing (users joining when bot is resetting)
2022-12-05 11:36:25 +01:00
Lili (Lin) Pavelů 9c0e709c63 Merge pull request #8 from trwnh/patch-3
Fix: Change POST to GET for certain API calls
2022-12-05 11:23:12 +01:00
Lili (Lin) Pavelů 99bdcc16cc Merge pull request #7 from trwnh/patch-2
Fix: Remove strict "is True" check
2022-12-05 11:22:58 +01:00
Lili (Lin) Pavelů 89c9d5945a Merge pull request #6 from trwnh/patch-1
Refactor: reduce nesting
2022-12-05 11:22:45 +01:00
trwnh 65b68f886e Fix: Change POST to GET for certain API calls
I'm not sure why Owncast responds to a POST when it should be a GET, but this is probably not reliable behaviour
2022-11-30 11:29:00 -06:00
trwnh fe57550de2 Fix: Remove strict "is True" check
`is True` checks that the value points to the same memory. To check for truthiness, use `== True` or simply `if condition`
2022-11-30 11:00:30 -06:00
trwnh 420d954568 Refactor: reduce nesting
We can reduce cyclomatic complexity (how far we indented) by checking for a negative condition and exiting early, instead of checking for a positive condition and continuing
2022-11-30 10:45:52 -06:00
5 changed files with 42 additions and 39 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ from setuptools import find_packages, setup
setup( setup(
name='tlapbot', name='tlapbot',
version='1.0.0', version='1.0.1',
packages=find_packages(), packages=find_packages(),
include_package_data=True, include_package_data=True,
install_requires=[ install_requires=[
+1 -1
View File
@@ -26,7 +26,7 @@ def create_app(test_config=None):
app.config.from_pyfile('redeems.py', silent=True) app.config.from_pyfile('redeems.py', silent=True)
# Make logging work for gunicorn-ran instances of tlapbot. # Make logging work for gunicorn-ran instances of tlapbot.
if app.config['GUNICORN'] is True: if app.config['GUNICORN']:
gunicorn_logger = logging.getLogger('gunicorn.error') gunicorn_logger = logging.getLogger('gunicorn.error')
app.logger.handlers = gunicorn_logger.handlers app.logger.handlers = gunicorn_logger.handlers
app.logger.setLevel(gunicorn_logger.level) app.logger.setLevel(gunicorn_logger.level)
+2 -2
View File
@@ -6,14 +6,14 @@ from sqlite3 import Error
# # # requests stuff # # # # # # requests stuff # # #
def is_stream_live(): def is_stream_live():
url = current_app.config['OWNCAST_INSTANCE_URL'] + '/api/status' url = current_app.config['OWNCAST_INSTANCE_URL'] + '/api/status'
r = requests.post(url) r = requests.get(url)
return r.json()["online"] return r.json()["online"]
def give_points_to_chat(db): def give_points_to_chat(db):
url = current_app.config['OWNCAST_INSTANCE_URL'] + '/api/integrations/clients' url = current_app.config['OWNCAST_INSTANCE_URL'] + '/api/integrations/clients'
headers = {"Authorization": "Bearer " + current_app.config['OWNCAST_ACCESS_TOKEN']} headers = {"Authorization": "Bearer " + current_app.config['OWNCAST_ACCESS_TOKEN']}
r = requests.post(url, headers=headers) r = requests.get(url, headers=headers)
unique_users = list(set(map(lambda user_object: user_object["user"]["id"], r.json()))) unique_users = list(set(map(lambda user_object: user_object["user"]["id"], r.json())))
for user_id in unique_users: for user_id in unique_users:
give_points_to_user(db, give_points_to_user(db,
+9 -9
View File
@@ -13,11 +13,14 @@ bp = Blueprint('owncast_webhooks', __name__)
def owncast_webhook(): def owncast_webhook():
data = request.json data = request.json
db = get_db() db = get_db()
if data["type"] == "USER_JOINED":
# Make sure user is in db before doing anything else.
if data["type"] in ["CHAT", "NAME_CHANGED", "USER_JOINED"]:
user_id = data["eventData"]["user"]["id"] user_id = data["eventData"]["user"]["id"]
display_name = data["eventData"]["user"]["displayName"] display_name = data["eventData"]["user"]["displayName"]
# CONSIDER: join points for joining stream
add_user_to_database(db, user_id, display_name) add_user_to_database(db, user_id, display_name)
if data["type"] == "USER_JOINED":
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["type"] == "NAME_CHANGE": elif data["type"] == "NAME_CHANGE":
@@ -31,15 +34,12 @@ def owncast_webhook():
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"]["body"]}') current_app.logger.debug(f'{data["eventData"]["body"]}')
if "!help" in data["eventData"]["body"]: if data["eventData"]["body"].startswith("!help"):
send_help() send_help()
elif "!points" in data["eventData"]["body"]: elif data["eventData"]["body"].startswith("!points"):
if not user_exists(db, user_id):
add_user_to_database(db, user_id, display_name)
points = read_users_points(db, user_id) points = read_users_points(db, user_id)
message = f"{display_name}'s points: {points}" send_chat(f"{display_name}'s points: {points}")
send_chat(message) elif data["eventData"]["body"].startswith("!name_update"):
elif "!name_update" in data["eventData"]["body"]:
# 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.
+12 -9
View File
@@ -12,12 +12,19 @@ def handle_redeem(message, user_id):
else: else:
note = split_message[1] note = split_message[1]
if redeem in current_app.config['REDEEMS']: if redeem not in current_app.config['REDEEMS']:
send_chat("Can't redeem, redeem not found.")
return
db = get_db() db = get_db()
price = current_app.config['REDEEMS'][redeem]["price"] price = current_app.config['REDEEMS'][redeem]["price"]
redeem_type = current_app.config['REDEEMS'][redeem]["type"] redeem_type = current_app.config['REDEEMS'][redeem]["type"]
points = read_users_points(db, user_id) points = read_users_points(db, user_id)
if points is not None and points >= price:
if not points or points < price:
send_chat(f"Can't redeem {redeem}, you don't have enough points.")
return
if redeem_type == "counter": if redeem_type == "counter":
add_to_counter(db, redeem) add_to_counter(db, redeem)
use_points(db, user_id, price) use_points(db, user_id, price)
@@ -27,15 +34,11 @@ def handle_redeem(message, user_id):
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.")
elif redeem_type == "note": elif redeem_type == "note":
if note is not None: if not note:
send_chat(f"Cannot redeem {redeem}, no note included.")
return
add_to_redeem_queue(db, user_id, redeem, note) add_to_redeem_queue(db, user_id, redeem, note)
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:
send_chat(f"Cannot redeem {redeem}, no note included.")
else: else:
send_chat(f"{redeem} not redeemed because of an error.") send_chat(f"{redeem} not redeemed because of an error.")
else:
send_chat(f"Can't redeem {redeem}, you don't have enough points.")
else:
send_chat("Can't redeem, redeem not found.")