webhooks.py 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from flask import Flask, request, json, Blueprint, current_app, render_template
  2. from ownchatbot.db import get_db
  3. from ownchatbot.owncast_com import send_chat
  4. from ownchatbot.user_handlers import add_user_to_points, change_name, get_users_points, remove_duplicates
  5. from ownchatbot.bot_messages import do_reward, help_message
  6. from ownchatbot.reward_handlers import all_active_goals, all_active_votes
  7. ocb = Blueprint('webhooks', __name__)
  8. @ocb.route('/chatHook', methods=['POST'])
  9. def chat_hook():
  10. prefix = current_app.config['PREFIX']
  11. data = request.json
  12. db = get_db()
  13. if data['type'] in ['CHAT', 'NAME_CHANGED', 'USER_JOINED']: # Check if the viewer is in the chatbot database
  14. user_id = data['eventData']['user']['id']
  15. display_name = data['eventData']['user']['displayName']
  16. add_user_to_points(db, user_id, display_name)
  17. if data['type'] == 'USER_JOINED': # Do username house cleaning when a viewer joins
  18. if data['eventData']['user']['authenticated']:
  19. remove_duplicates(db, user_id, display_name)
  20. elif data['type'] == 'NAME_CHANGE':
  21. user_id = data['eventData']['user']['id']
  22. new_name = data['eventData']['newName']
  23. change_name(db, user_id, new_name)
  24. if data['eventData']['user']['authenticated']:
  25. remove_duplicates(db, user_id, new_name)
  26. elif data['type'] == 'CHAT': # If a chat message, sort out what command it is
  27. user_id = data['eventData']['user']['id']
  28. display_name = data['eventData']['user']['displayName']
  29. current_app.logger.debug(f'Chat message from {display_name}:')
  30. current_app.logger.debug(f'{data["eventData"]["rawBody"]}')
  31. lowercase_msg = data['eventData']['rawBody'].lower() # Convert body to lower case to match reward case
  32. if lowercase_msg.startswith(f'{prefix}help'): # Send the help message
  33. help_message()
  34. elif lowercase_msg.startswith(f'{prefix}points'): # Get the viewer's current points
  35. points = get_users_points(db, user_id)
  36. if points is None:
  37. send_chat('Couldn\'t get your points, for some highly technical reason.')
  38. else:
  39. send_chat(f'{display_name}, you have {points} points.')
  40. elif lowercase_msg.startswith(f'{prefix}rewards'): # Send rewards list
  41. if current_app.config['REWARDS']:
  42. rewards_msg = f'Currently active rewards:'
  43. for reward, details in current_app.config['REWARDS'].items():
  44. if details.get('categories'):
  45. if not (set(details['categories']) & set(current_app.config['ACTIVE_CAT'])): # If there are no common categories, continue
  46. continue
  47. if 'type' in details and details['type'] == 'goal':
  48. rewards_msg = f'{rewards_msg}<br>* {prefix}{reward} goal at {details["target"]} contributed points.'
  49. else:
  50. rewards_msg = f'{rewards_msg}<br>* {prefix}{reward} for {details["price"]} points.'
  51. if 'info' in details:
  52. rewards_msg = f'{rewards_msg}<br>{details["info"]}'
  53. else:
  54. rewards_msg = f'{rewards_msg}'
  55. else:
  56. rewards_msg = 'There are currently no active rewards.'
  57. send_chat(rewards_msg)
  58. elif lowercase_msg.startswith(f'{prefix}'): # Send to handle rewards
  59. do_reward(lowercase_msg, user_id)
  60. return data
  61. @ocb.route('/goals', methods=['GET']) # Route for goals overlay
  62. def goals():
  63. db = get_db()
  64. return render_template('goals.html',
  65. goals=all_active_goals(db))
  66. @ocb.route('/votes', methods=['GET']) # Route for votes overlay
  67. def votes():
  68. db = get_db()
  69. return render_template('votes.html',
  70. votes=all_active_votes(db))