groupme_bot.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import atexit
  2. from logging.config import dictConfig
  3. from threading import Thread
  4. import random
  5. from flask import Flask, request
  6. import requests
  7. import requests.exceptions
  8. from rollbot import Rollbot, RollbotMessage, RollbotPlugin
  9. import plugins
  10. import db
  11. from config import BOTS_LOOKUP, get_config, get_secret
  12. GLOBAL_ADMINS = get_secret("auths.global")
  13. GROUP_ADMINS = get_secret("auths.group")
  14. dictConfig({
  15. "version": 1,
  16. "formatters": {"default": {
  17. "format": "[%(asctime)s] %(levelname)s in %(module)s: %(message)s",
  18. }},
  19. "handlers": {"wsgi": {
  20. "class": "logging.StreamHandler",
  21. "stream": "ext://flask.logging.wsgi_errors_stream",
  22. "formatter": "default"
  23. }},
  24. "root": {
  25. "level": "INFO",
  26. "handlers": ["wsgi"]
  27. }
  28. })
  29. def post_groupme_message(msg, group_id):
  30. bot_id = BOTS_LOOKUP[group_id]
  31. try:
  32. requests.post(
  33. "https://api.groupme.com/v3/bots/post",
  34. json={
  35. "bot_id": bot_id,
  36. "text": msg
  37. },
  38. timeout=10
  39. )
  40. except requests.exceptions.Timeout as t:
  41. app.logger.error(f"GroupMe timed out sending {msg} as {bot_id}", exc_info=t)
  42. except requests.exceptions.HTTPError as h:
  43. app.log_exception(h)
  44. app = Flask(__name__)
  45. app.config["PROPAGATE_EXCEPTIONS"] = True
  46. rollbot = Rollbot(
  47. logger=app.logger,
  48. plugin_classes=RollbotPlugin.find_all_plugins(),
  49. aliases=get_config("aliases"),
  50. responses=get_config("responses"),
  51. sleep_time=float(get_config("sleep_time")),
  52. callback=post_groupme_message,
  53. session_factory=db.Session
  54. )
  55. app.logger.info("Initializing database tables")
  56. db.init_db()
  57. app.logger.info("Finished initializing database")
  58. rollbot.start_plugins()
  59. atexit.register(rollbot.shutdown_plugins)
  60. @app.route("/", methods=["POST"])
  61. def execute():
  62. json = request.get_json()
  63. msg = RollbotMessage.from_groupme(json, global_admins=GLOBAL_ADMINS, group_admins=GROUP_ADMINS)
  64. if msg.group_id not in BOTS_LOOKUP:
  65. app.logger.warning(f"Received message from unknown group ID {msg.group_id}")
  66. return "", 400
  67. t = Thread(target=lambda: rollbot.handle_command(msg))
  68. t.start()
  69. return "", 204
  70. @app.route("/health")
  71. def health():
  72. return "Rollbot healthy!", 200
  73. if __name__ == "__main__":
  74. app.run(host="0.0.0.0", port=6070)