Compare commits
10
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
384ca03e23 | ||
|
|
7722bdf608 | ||
|
|
7dfc8faae7 | ||
|
|
8e4d21c02f | ||
|
|
571aa47aab | ||
|
|
433564bddf | ||
|
|
1abab80da4 | ||
|
|
894ff175a6 | ||
|
|
6641121ca3 | ||
|
|
7ffb1a15b0 |
@@ -329,7 +329,8 @@ REDEEMS={
|
|||||||
```
|
```
|
||||||
#### File format
|
#### File format
|
||||||
`redeems.py` is a config file with just a `REDEEMS` key, that assigns a dictionary of redeems to it.
|
`redeems.py` is a config file with just a `REDEEMS` key, that assigns a dictionary of redeems to it.
|
||||||
Each dictionary entry is a redeem, and the dictionary keys are strings that decides the chat command for the redeem.
|
Each dictionary entry is a redeem, and the dictionary keys are strings that decide the chat command for the redeem.
|
||||||
|
The redeem names shouldn't have spaces in them.
|
||||||
The value is another dictionary that needs to have an entry for `"type"` and
|
The value is another dictionary that needs to have an entry for `"type"` and
|
||||||
an entry for `"price"` for non-milestones or `"goal"` for milestones.
|
an entry for `"price"` for non-milestones or `"goal"` for milestones.
|
||||||
Optionally, each redeem can also have `"info"` and `"category"` entries.
|
Optionally, each redeem can also have `"info"` and `"category"` entries.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from setuptools import find_packages, setup
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='tlapbot',
|
name='tlapbot',
|
||||||
version='1.2.1',
|
version='1.2.2a1',
|
||||||
packages=find_packages(),
|
packages=find_packages(),
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
install_requires=[
|
install_requires=[
|
||||||
|
|||||||
@@ -35,6 +35,13 @@ def create_app(test_config=None):
|
|||||||
if len(app.config['PREFIX']) != 1:
|
if len(app.config['PREFIX']) != 1:
|
||||||
raise RuntimeError("Prefix is >1 character. "
|
raise RuntimeError("Prefix is >1 character. "
|
||||||
"Change your config to set 1-character prefix.")
|
"Change your config to set 1-character prefix.")
|
||||||
|
|
||||||
|
# Check for spaces in redeems (they won't work)
|
||||||
|
for redeem, _ in app.config['REDEEMS']:
|
||||||
|
if ' ' in redeem:
|
||||||
|
app.logger.warning(f"Redeem {redeem} has spaces in its name.")
|
||||||
|
app.logger.warning("Redeems with spaces are impossible to redeem.")
|
||||||
|
|
||||||
|
|
||||||
# prepare webhooks and redeem dashboard blueprints
|
# prepare webhooks and redeem dashboard blueprints
|
||||||
from . import owncast_webhooks
|
from . import owncast_webhooks
|
||||||
|
|||||||
@@ -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.\n")
|
message.append("Tlapbot gives you points for being in chat, and then allows you to spend those points. <br>")
|
||||||
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(f"People connected to chat receive {current_app.config['POINTS_AMOUNT_GIVEN']} points every {current_app.config['POINTS_CYCLE_TIME']} seconds. <br>")
|
||||||
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("You can see your points and recent redeems in the Tlapbot dashboard. Look for a button to click under the stream window. <br>")
|
||||||
message.append("""Tlapbot commands:
|
message.append("""Tlapbot commands: <br>
|
||||||
!help to see this help message.
|
!help to see this help message. <br>
|
||||||
!points to see your points.\n"""
|
!points to see your points. <br>"""
|
||||||
)
|
)
|
||||||
if current_app.config['LIST_REDEEMS']:
|
if current_app.config['LIST_REDEEMS']:
|
||||||
message.append("Active redeems:\n")
|
message.append("Active redeems: <br>")
|
||||||
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']}\n")
|
message.append(f"!{redeem} for {redeem_info['price']} points. {redeem_info['info']} <br>")
|
||||||
else:
|
else:
|
||||||
message.append(f"!{redeem} for {redeem_info['price']} points.\n")
|
message.append(f"!{redeem} for {redeem_info['price']} points. <br>")
|
||||||
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))
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ 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/.*?">',
|
||||||
|
|||||||
@@ -36,22 +36,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"]["body"]}')
|
current_app.logger.debug(f'{data["eventData"]["rawBody"]}')
|
||||||
if data["eventData"]["body"].startswith(f"{prefix}help"):
|
if data["eventData"]["rawBody"].startswith(f"{prefix}help"):
|
||||||
send_help()
|
send_help()
|
||||||
elif data["eventData"]["body"].startswith(f"{prefix}points"):
|
elif data["eventData"]["rawBody"].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"]["body"].startswith(f"{prefix}name_update"):
|
elif data["eventData"]["rawBody"].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"]["body"].startswith(prefix):
|
elif data["eventData"]["rawBody"].startswith(prefix):
|
||||||
handle_redeem(data["eventData"]["body"], user_id)
|
handle_redeem(data["eventData"]["rawBody"], user_id)
|
||||||
return data
|
return data
|
||||||
|
|||||||
@@ -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, remove_emoji
|
from tlapbot.owncast_helpers import use_points, read_users_points
|
||||||
|
|
||||||
|
|
||||||
def handle_redeem(message, user_id):
|
def handle_redeem(message, user_id):
|
||||||
@@ -32,9 +32,11 @@ def handle_redeem(message, user_id):
|
|||||||
elif not note:
|
elif not note:
|
||||||
send_chat(f"Cannot redeem {redeem}, no amount of points specified.")
|
send_chat(f"Cannot redeem {redeem}, no amount of points specified.")
|
||||||
elif not note.isdigit():
|
elif not note.isdigit():
|
||||||
send_chat(f"Cannot redeem {redeem}, amount of points is not an integer.")
|
send_chat(f"Cannot redeem {redeem}, amount of points is not a positive integer.")
|
||||||
elif int(note) > points:
|
elif int(note) > points:
|
||||||
send_chat(f"Can't redeem {redeem}, you're donating more points than you have.")
|
send_chat(f"Can't redeem {redeem}, you're donating more points than you have.")
|
||||||
|
elif int(note) == 0:
|
||||||
|
send_chat(f"Can't donate zero points.")
|
||||||
elif add_to_milestone(db, user_id, redeem, int(note)):
|
elif add_to_milestone(db, user_id, redeem, int(note)):
|
||||||
send_chat(f"Succesfully donated to {redeem} milestone!")
|
send_chat(f"Succesfully donated to {redeem} milestone!")
|
||||||
if check_apply_milestone_completion(db, redeem):
|
if check_apply_milestone_completion(db, redeem):
|
||||||
@@ -64,7 +66,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, remove_emoji(note)) and
|
if (add_to_redeem_queue(db, user_id, redeem, 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:
|
||||||
|
|||||||
Reference in New Issue
Block a user