Compare commits

...

10 Commits

6 changed files with 104 additions and 61 deletions

1
.gitignore vendored
View File

@ -6,3 +6,4 @@ msgid
tmppic.jpg tmppic.jpg
venv venv
__pycache__/ __pycache__/
twitch-tgbot.cfg

View File

@ -1,6 +0,0 @@
streamer = "1n7er"
appid="addid"
appsecret="addsecret"
tgtoken = "token"
tgchat = "chat"
period = 300

View File

@ -1,3 +1,2 @@
twitchAPI==2.5.7.1 twitchAPI==2.5.7.1
termcolor telebot
pyTelegramBotAPI==4.8.0

47
src/log_msg.py Normal file
View File

@ -0,0 +1,47 @@
import logging
from logging.handlers import TimedRotatingFileHandler
import sys
log_format = logging.Formatter('%(asctime)s %(levelname)s:%(message)s')
log_file = 'output.log'
class CustomFormatter(logging.Formatter):
grey = "\x1b[38;20m"
yellow = "\x1b[33;20m"
red = "\x1b[31;20m"
bold_red = "\x1b[31;1m"
reset = "\x1b[0m"
format = "%(asctime)s %(levelname)s - %(message)s"
FORMATS = {
logging.DEBUG: grey + format + reset,
logging.INFO: grey + format + reset,
logging.WARNING: yellow + format + reset,
logging.ERROR: red + format + reset,
logging.CRITICAL: bold_red + format + reset
}
def format(self, record):
log_fmt = self.FORMATS.get(record.levelno)
formatter = logging.Formatter(log_fmt)
return formatter.format(record)
class MyLog:
def __init__(self):
self.logger = logging.getLogger("main")
self.logger.setLevel(logging.DEBUG)
# Console logging
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(log_format)
console = console_handler
console.setFormatter(CustomFormatter())
self.logger.addHandler(console)
file_handler = TimedRotatingFileHandler(log_file, when='midnight')
file_handler.setFormatter(log_format)
self.logger.addHandler(file_handler)
self.logger.propagate = False

38
src/parse_config.py Normal file
View File

@ -0,0 +1,38 @@
from dataclasses import dataclass, asdict
import configparser
@dataclass(slots=True, frozen=True)
class Config:
streamer: str
app_id: str
app_secret: str
target_tg_chat: str
tg_token: str
check_period: int
cleanup_msg: bool
@classmethod
def load(cls, config_path: str = "twitch-tgbot.cfg") -> 'Config':
"""
Эта функция либо читает существующий конфиг, либо создает новый.
Возвращает объект конфига (configparser.ConfigParser())
"""
config_file = configparser.ConfigParser()
# Читаем конфиг, если пустой - заполняем
if not config_file.read(config_path) or not config_file.has_section('twitch'):
config_file.add_section('twitch')
twitch = config_file['twitch']
config = Config(
streamer=twitch.get('streamer',fallback='the_viox'),
app_id=twitch.get('app_id',fallback=''),
app_secret=twitch.get('app_secret',fallback=''),
target_tg_chat=twitch.get('target_tg_chat',fallback=''),
tg_token=twitch.get('tg_token',fallback=''),
check_period=twitch.getint('check_period',fallback=10),
cleanup_msg=twitch.getboolean('cleanup_msg',fallback=True)
)
with open(config_path, 'w') as cfg_file:
config_file.read_dict({'twitch': asdict(config)})
config_file.write(cfg_file)
return config

View File

@ -1,15 +1,8 @@
#!/usr/bin/python3 #!/usr/bin/env python3
import time import time
import os import os
import sys
import logging
sys.path.append(os.path.abspath(os.path.curdir))
import config_python
from twitchAPI.twitch import Twitch from twitchAPI.twitch import Twitch
from logging.handlers import TimedRotatingFileHandler
from termcolor import colored
import telebot import telebot
from telebot.types import InputFile from telebot.types import InputFile
from telebot import types from telebot import types
@ -17,12 +10,8 @@ from datetime import datetime
import requests import requests
import shutil import shutil
streamer = config_python.streamer from parse_config import Config
app_id = config_python.appid from log_msg import MyLog
app_secret = config_python.appsecret
log_format = logging.Formatter('%(asctime)s %(levelname)s:%(message)s')
log_file = 'output.log'
def stream_message_worker(data: dict): def stream_message_worker(data: dict):
@ -55,7 +44,7 @@ def stream_message_worker(data: dict):
"Длительность: " + str(stream_duration) "Длительность: " + str(stream_duration)
# Готовим кнопку # Готовим кнопку
stream_button = types.InlineKeyboardButton('Открыть стрим', url='https://twitch.tv/'+streamer) stream_button = types.InlineKeyboardButton('Открыть стрим', url='https://twitch.tv/'+config_python.streamer)
keyboard = types.InlineKeyboardMarkup() keyboard = types.InlineKeyboardMarkup()
keyboard.add(stream_button) keyboard.add(stream_button)
@ -71,7 +60,7 @@ def stream_message_worker(data: dict):
if msgid == 0: if msgid == 0:
# Отправляем новое сообщение # Отправляем новое сообщение
send_message = bot.send_photo(config_python.tgchat, InputFile('tmppic.jpg'), message, reply_markup=keyboard, send_message = bot.send_photo(config_python.target_tg_chat, InputFile('tmppic.jpg'), message, reply_markup=keyboard,
parse_mode='MarkdownV2') parse_mode='MarkdownV2')
print(send_message) print(send_message)
msgid = send_message.message_id msgid = send_message.message_id
@ -82,9 +71,9 @@ def stream_message_worker(data: dict):
# Готовим медиа для отправки # Готовим медиа для отправки
media = telebot.types.InputMediaPhoto(InputFile('tmppic.jpg')) media = telebot.types.InputMediaPhoto(InputFile('tmppic.jpg'))
# Редактируем фотку # Редактируем фотку
edit_msg_media = bot.edit_message_media(media, config_python.tgchat, msgid, reply_markup=keyboard) edit_msg_media = bot.edit_message_media(media, config_python.target_tg_chat, msgid, reply_markup=keyboard)
# Редактируем текст # Редактируем текст
edit_msg_caption = bot.edit_message_caption(message, config_python.tgchat, msgid, reply_markup=keyboard, edit_msg_caption = bot.edit_message_caption(message, config_python.target_tg_chat, msgid, reply_markup=keyboard,
parse_mode='MarkdownV2') parse_mode='MarkdownV2')
except telebot.apihelper.ApiTelegramException as e: except telebot.apihelper.ApiTelegramException as e:
log.error(e) log.error(e)
@ -92,7 +81,7 @@ def stream_message_worker(data: dict):
# Если стрим не идет # Если стрим не идет
def no_stream_msg_worker(): def no_stream_msg_worker():
log.info(streamer + " Не стримит") log.info(config_python.streamer + " Не стримит")
# Проверяем наличие файла # Проверяем наличие файла
if os.path.exists('msgid'): if os.path.exists('msgid'):
# Если файл существует - читаем # Если файл существует - читаем
@ -102,11 +91,11 @@ def no_stream_msg_worker():
# Если пустой - удаляем # Если пустой - удаляем
os.remove('msgid') os.remove('msgid')
else: else:
if config_python.delete_msg: if config_python.cleanup_msg:
# Если не пустой, то удаляем сообщение по айдишнику # Если не пустой, то удаляем сообщение по айдишнику
try: try:
# Удаляем сообщение # Удаляем сообщение
edit_msg = bot.delete_message(config_python.tgchat, int(msgid)) edit_msg = bot.delete_message(config_python.target_tg_chat, int(msgid))
except telebot.apihelper.ApiTelegramException as e: except telebot.apihelper.ApiTelegramException as e:
log.error(e) log.error(e)
# В конце удаляем айди сообщения # В конце удаляем айди сообщения
@ -121,14 +110,9 @@ def check_alive():
""" """
# Получаем инфо о стримере, если не получается, выходим с ошибкой # Получаем инфо о стримере, если не получается, выходим с ошибкой
resolved_id = twitch_client.get_users(logins=[streamer]) resolved_id = twitch_client.get_users(logins=[config_python.streamer])
if not resolved_id['data']: if not resolved_id['data']:
log.error( log.error("Аккаунт " + config_python.streamer + " не найден")
colored(
"Аккаунт " + streamer + " не найден",
'red',
)
)
# Достаем ID стримера из инфо # Достаем ID стримера из инфо
user_id = resolved_id['data'][0]['id'] user_id = resolved_id['data'][0]['id']
# Получаем стримы # Получаем стримы
@ -141,33 +125,13 @@ def check_alive():
no_stream_msg_worker() no_stream_msg_worker()
def get_console_handler():
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(log_format)
return console_handler
def get_file_handler():
file_handler = TimedRotatingFileHandler(log_file, when='midnight')
file_handler.setFormatter(log_format)
return file_handler
def get_logger(logger_name):
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
logger.addHandler(get_console_handler())
logger.addHandler(get_file_handler())
logger.propagate = False
return logger
if __name__ == '__main__': if __name__ == '__main__':
log = get_logger("main") log = MyLog().logger
log.info("Запущен") log.info("Запущен")
twitch_client = Twitch(app_id, app_secret) config_python = Config.load()
bot = telebot.TeleBot(config_python.tgtoken) twitch_client = Twitch(config_python.app_id, config_python.app_secret)
bot = telebot.TeleBot(config_python.tg_token)
while True: while True:
check_alive() check_alive()
time.sleep(config_python.period) time.sleep(config_python.check_period)