groupme_bot.py 2.0 KB

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