__init__.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import os
  2. import logging
  3. from flask import Flask, g
  4. from ownchatbot.db import get_db
  5. from ownchatbot.owncast_com import live_now, award_points, send_system_chat
  6. from apscheduler.schedulers.background import BackgroundScheduler
  7. current_index = 0
  8. def create_app(test_config=None):
  9. app = Flask(__name__, instance_relative_config=True)
  10. try:
  11. os.makedirs(app.instance_path)
  12. except OSError:
  13. pass
  14. app.config.from_mapping(
  15. DATABASE=os.path.join(app.instance_path, 'ownchatbot.sqlite')
  16. )
  17. app.config.from_object('ownchatbot.defaults.config') # Read from config files
  18. app.config.from_pyfile('config.py', silent=True)
  19. app.config.from_object('ownchatbot.defaults.rewards')
  20. app.config.from_pyfile('rewards.py', silent=True)
  21. app.config.from_object('ownchatbot.defaults.categories')
  22. app.config.from_pyfile('categories.py', silent=True)
  23. app.config.from_object('ownchatbot.defaults.kofi')
  24. app.config.from_pyfile('kofi.py', silent=True)
  25. app.config.from_object('ownchatbot.defaults.announce')
  26. app.config.from_pyfile('announce.py', silent=True)
  27. if app.config['GUNICORN']: # Gunicorn logging integration
  28. gunicorn_logger = logging.getLogger('gunicorn.error')
  29. app.logger.handlers = gunicorn_logger.handlers
  30. app.logger.setLevel(gunicorn_logger.level)
  31. from . import webhooks # Set up blueprints
  32. from . import web_panels
  33. app.register_blueprint(webhooks.ocb)
  34. app.register_blueprint(web_panels.ocb)
  35. from . import db # Set up cli commands
  36. db.init_app(app)
  37. announcements = app.config['ANNOUNCEMENTS']
  38. def announce():
  39. if app.config['ANNOUNCE_ENABLE']: # If announcements are enabled
  40. global current_index
  41. message = announcements[current_index]
  42. send_system_chat(message)
  43. current_index = (current_index + 1) % len(announcements)
  44. else:
  45. app.logger.info(f'Not live, so not sending announcement.')
  46. def award_job():
  47. with app.app_context():
  48. if live_now(): # If stream is live
  49. award_points(get_db())
  50. def announce_job():
  51. with app.app_context():
  52. if live_now(): # If stream is live
  53. announce()
  54. jorel_master_of_scheduling = BackgroundScheduler()
  55. points_seconds = app.config['POINTS_INTERVAL'] * 60
  56. announce_seconds = app.config['ANNOUNCE_INTERVAL'] * 60
  57. jorel_master_of_scheduling.add_job(award_job, 'interval', seconds=points_seconds)
  58. jorel_master_of_scheduling.add_job(announce_job, 'interval', seconds=announce_seconds)
  59. jorel_master_of_scheduling.start()
  60. return app
  61. if __name__ == '__main__':
  62. create_app()