Queer European MD passionate about IT

bot.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. """Provide bike sharing information via Telegram bot."""
  2. # Standard library modules
  3. import logging
  4. import os
  5. import sys
  6. # Third party modules
  7. import davtelepot
  8. # Project modules
  9. from . import ciclopi, messages
  10. from .messages import (
  11. default_help_messages, language_messages, supported_languages
  12. )
  13. def main(bot_token: str = None,
  14. path: str = None,
  15. log_file_name: str = None,
  16. errors_file_name: str = None,
  17. local_host: str = None,
  18. port: int = None,
  19. hostname: str = None,
  20. certificate: str = None):
  21. if bot_token is None:
  22. try:
  23. from .data.passwords import bot_token
  24. except ImportError:
  25. logging.error(
  26. "Missing bot token. Create a bot with t.me/BotFather and "
  27. "provide its token here to run a local copy of CicloPiBot."
  28. )
  29. return
  30. if path is None:
  31. path = os.path.dirname(
  32. os.path.abspath(
  33. __file__
  34. )
  35. )
  36. if log_file_name is None:
  37. try:
  38. from .data.config import log_file_name
  39. except ImportError:
  40. log_file_name = 'CicloPi.info.log'
  41. if errors_file_name is None:
  42. try:
  43. from .data.config import errors_file_name
  44. except ImportError:
  45. errors_file_name = 'CicloPi.errors.log'
  46. if local_host is None:
  47. try:
  48. from .data.config import local_host
  49. except ImportError:
  50. local_host = 'localhost'
  51. if port is None:
  52. try:
  53. from .data.config import port
  54. except ImportError:
  55. port = 3000
  56. if hostname is None:
  57. try:
  58. from .data.config import hostname
  59. except ImportError:
  60. hostname = ''
  61. if certificate is None:
  62. try:
  63. from .data.config import certificate
  64. except ImportError:
  65. certificate = None
  66. log_file = f"{path}/data/{log_file_name}"
  67. errors_file = f"{path}/data/{errors_file_name}"
  68. # Outputs the log in console, log_file and errors_file
  69. # Log formatter: datetime, module name (filled with spaces up to 15
  70. # characters), logging level name (filled to 8), message
  71. # noinspection SpellCheckingInspection
  72. log_formatter = logging.Formatter(
  73. "%(asctime)s [%(module)-15s %(levelname)-8s] %(message)s",
  74. style='%'
  75. )
  76. root_logger = logging.getLogger()
  77. root_logger.setLevel(logging.DEBUG)
  78. file_handler = logging.FileHandler(log_file, mode="a", encoding="utf-8")
  79. file_handler.setFormatter(log_formatter)
  80. file_handler.setLevel(logging.DEBUG)
  81. root_logger.addHandler(file_handler)
  82. file_handler = logging.FileHandler(errors_file, mode="a", encoding="utf-8")
  83. file_handler.setFormatter(log_formatter)
  84. file_handler.setLevel(logging.ERROR)
  85. root_logger.addHandler(file_handler)
  86. console_handler = logging.StreamHandler()
  87. console_handler.setFormatter(log_formatter)
  88. console_handler.setLevel(logging.DEBUG)
  89. root_logger.addHandler(console_handler)
  90. # Instantiate bot
  91. bot = davtelepot.bot.Bot(token=bot_token,
  92. database_url=f'{path}/data/ciclopi.db',
  93. hostname=hostname, certificate=certificate)
  94. bot.set_path(path)
  95. bot.set_class_log_file_name(log_file_name)
  96. bot.set_class_errors_file_name(errors_file_name)
  97. bot.set_unknown_command_message(
  98. messages.unknown_command_message
  99. )
  100. bot.set_authorization_denied_message(
  101. messages.authorization_denied_message
  102. )
  103. bot.db['users'].upsert(
  104. dict(
  105. telegram_id=63538990,
  106. privileges=1
  107. ),
  108. ['telegram_id']
  109. )
  110. davtelepot.administration_tools.init(bot)
  111. ciclopi.init(bot)
  112. davtelepot.authorization.init(bot)
  113. davtelepot.languages.init(
  114. bot, language_messages=language_messages,
  115. supported_languages=supported_languages
  116. )
  117. davtelepot.suggestions.init(bot)
  118. davtelepot.helper.init(bot, help_messages=default_help_messages)
  119. # Run bot(s)
  120. logging.info("Press ctrl+C to exit.")
  121. exit_state = davtelepot.bot.Bot.run(
  122. local_host=local_host,
  123. port=port
  124. )
  125. return exit_state
  126. if __name__ == '__main__':
  127. sys.exit(main())