some fixes

This commit is contained in:
KatykhinAA
2024-06-03 19:45:04 +03:00
parent c70219b481
commit 00bb2fa74e
4 changed files with 868 additions and 854 deletions

408
db.py
View File

@@ -1,204 +1,204 @@
import sqlite3 import sqlite3
import configparser import configparser
import os import os
import sys import sys
config_path = os.path.join(sys.path[0], 'settings.ini') config_path = os.path.join(sys.path[0], 'settings.ini')
config = configparser.ConfigParser() config = configparser.ConfigParser()
config.read(config_path) config.read(config_path)
LOGS = config.getboolean('Settings', 'logs') LOGS = config.getboolean('Settings', 'logs')
IMPORTANT_LOGS = config.get('Telegram', 'important_logs') IMPORTANT_LOGS = config.get('Telegram', 'important_logs')
class BotDB: class BotDB:
def __init__(self, db_file): def __init__(self, db_file):
self.conn = sqlite3.connect(db_file, check_same_thread=False) self.conn = sqlite3.connect(db_file, check_same_thread=False)
self.cursor = self.conn.cursor() self.cursor = self.conn.cursor()
def get_message_from_db(self, type: str, username): def get_message_from_db(self, type: str, username):
"""Функция для запроса к базе данных и получения сообщений для бота. В аргументы передаются: """Функция для запроса к базе данных и получения сообщений для бота. В аргументы передаются:
type - тип получаемой обратной связи, строковое значение, сохраненное в БД type - тип получаемой обратной связи, строковое значение, сохраненное в БД
username - имя пользователя username - имя пользователя
""" """
# Подключаемся к базе # Подключаемся к базе
try: try:
cursor = self.conn.cursor() cursor = self.conn.cursor()
cursor.execute(f"SELECT * FROM messages WHERE type=?", (type,)) cursor.execute(f"SELECT * FROM messages WHERE type=?", (type,))
# Забираем данные из таблицы, преобразуем в строку, заменяем поле username на имя пользователя, # Забираем данные из таблицы, преобразуем в строку, заменяем поле username на имя пользователя,
# и вместо амберсанда подставляем перенос строки # и вместо амберсанда подставляем перенос строки
if type == 'connect_with_admin' or type == 'del_message' or type == 'suggest_news' or type == 'start_message': if type == 'connect_with_admin' or type == 'del_message' or type == 'suggest_news' or type == 'start_message':
response_from_database = str(cursor.fetchone()[1]).replace('username', username).replace('&', '\n') response_from_database = str(cursor.fetchone()[1]).replace('username', username).replace('&', '\n')
else: else:
response_from_database = str(cursor.fetchone()[1]).replace('&', '\n') response_from_database = str(cursor.fetchone()[1]).replace('&', '\n')
return response_from_database return response_from_database
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_error_message_from_db(self, id: int): def get_error_message_from_db(self, id: int):
"""Функция для запроса к базе данных и получения сообщений ошибки. В аргументы передаются: """Функция для запроса к базе данных и получения сообщений ошибки. В аргументы передаются:
id - идентификатор ошибки id - идентификатор ошибки
""" """
# Подключаемся к базе # Подключаемся к базе
try: try:
cursor = self.conn.cursor() cursor = self.conn.cursor()
cursor.execute(f"SELECT * FROM error_messages WHERE id=?", (id,)) cursor.execute(f"SELECT * FROM error_messages WHERE id=?", (id,))
response_from_database = str(cursor.fetchone()[1]) response_from_database = str(cursor.fetchone()[1])
return response_from_database return response_from_database
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def add_new_user_in_db(self, user_id, first_name, full_name, username, is_bot, language_code, date_added, date_changed): def add_new_user_in_db(self, user_id, first_name, full_name, username, is_bot, language_code, date_added, date_changed):
"""Добавляем юзера в базу""" """Добавляем юзера в базу"""
try: try:
self.cursor.execute("INSERT INTO 'our_users' ('user_id', 'first_name', 'full_name', 'username', 'is_bot', " self.cursor.execute("INSERT INTO 'our_users' ('user_id', 'first_name', 'full_name', 'username', 'is_bot', "
"'language_code', 'date_added', 'date_changed') VALUES (?, ?, ?, ?, ?, ?, ?, ?)", "'language_code', 'date_added', 'date_changed') VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
(user_id, first_name, full_name, (user_id, first_name, full_name,
username,is_bot,language_code,date_added,date_changed)) username,is_bot,language_code,date_added,date_changed))
return self.conn.commit() return self.conn.commit()
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def user_exists(self, user_id): def user_exists(self, user_id):
"""Проверяем, есть ли юзер в базе""" """Проверяем, есть ли юзер в базе"""
try: try:
result = self.cursor.execute("SELECT `id` FROM `our_users` WHERE `user_id` = ?", (user_id,)) result = self.cursor.execute("SELECT `id` FROM `our_users` WHERE `user_id` = ?", (user_id,))
return bool(len(result.fetchall())) return bool(len(result.fetchall()))
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_user_id(self, user_id): def get_user_id(self, user_id):
"""Достаем id юзера в базе по его user_id""" """Достаем id юзера в базе по его user_id"""
try: try:
result = self.cursor.execute("SELECT `id` FROM `our_users` WHERE `user_id` = ?", (user_id,)) result = self.cursor.execute("SELECT `id` FROM `our_users` WHERE `user_id` = ?", (user_id,))
return result.fetchone()[0] return result.fetchone()[0]
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_username(self, user_id): def get_username(self, user_id):
"""Достаем id юзера в базе по его user_id""" """Достаем id юзера в базе по его user_id"""
try: try:
result = self.cursor.execute("SELECT `username` FROM `our_users` WHERE `user_id` = ?", (user_id,)) result = self.cursor.execute("SELECT `username` FROM `our_users` WHERE `user_id` = ?", (user_id,))
return result.fetchone()[0] return result.fetchone()[0]
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_all_user_id(self): def get_all_user_id(self):
"""Достаем все айдишники юзеров из БД и преобразуем их в список""" """Достаем все айдишники юзеров из БД и преобразуем их в список"""
try: try:
result = self.cursor.execute("SELECT `user_id` FROM `our_users`",) result = self.cursor.execute("SELECT `user_id` FROM `our_users`",)
fetch_all = result.fetchall() fetch_all = result.fetchall()
list_of_users = [] list_of_users = []
for i in fetch_all: for i in fetch_all:
list_of_users.append(i[0]) list_of_users.append(i[0])
return list_of_users return list_of_users
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_user_first_name(self, user_id): def get_user_first_name(self, user_id):
try: try:
result = self.cursor.execute("SELECT `first_name` FROM `our_users` WHERE `user_id` = ?", (user_id,)) result = self.cursor.execute("SELECT `first_name` FROM `our_users` WHERE `user_id` = ?", (user_id,))
return result.fetchone()[0] return result.fetchone()[0]
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def change_name(self, user_id): def change_name(self, user_id):
#TODO: реализовать функцию изменения имени пользователя по которому к нему обращается бот. ОБновляем поля first_name, date_changed #TODO: реализовать функцию изменения имени пользователя по которому к нему обращается бот. ОБновляем поля first_name, date_changed
#result = self.cursor.execute("UPDATE 'our_users' SET (?) WHERE user_id = (?)", (new_user_name), ) #result = self.cursor.execute("UPDATE 'our_users' SET (?) WHERE user_id = (?)", (new_user_name), )
pass pass
def add_audio_record(self, file_name, author_id, date_added, listen_count, file_id): def add_audio_record(self, file_name, author_id, date_added, listen_count, file_id):
"""Добавляет информацию о войсе юзера в БД""" """Добавляет информацию о войсе юзера в БД"""
try: try:
result = self.cursor.execute("INSERT INTO `audio_message_reference` (file_name, author_id, date_added, listen_count, file_id) VALUES (?, ?, ?, ?, ?)", (file_name, author_id, date_added, listen_count, file_id)) result = self.cursor.execute("INSERT INTO `audio_message_reference` (file_name, author_id, date_added, listen_count, file_id) VALUES (?, ?, ?, ?, ?)", (file_name, author_id, date_added, listen_count, file_id))
return self.conn.commit() return self.conn.commit()
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def last_date_audio(self): def last_date_audio(self):
"""Получаем дату последнего войса""" """Получаем дату последнего войса"""
try: try:
result = self.cursor.execute( result = self.cursor.execute(
"SELECT `date_added` FROM `audio_message_reference` ORDER BY date_added DESC LIMIT 1") "SELECT `date_added` FROM `audio_message_reference` ORDER BY date_added DESC LIMIT 1")
return result.fetchone()[0] return result.fetchone()[0]
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_last_user_audio_record(self, user_id): def get_last_user_audio_record(self, user_id):
"""Получает данные о количестве записей пользователя""" """Получает данные о количестве записей пользователя"""
try: try:
result = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ?", (user_id,)) result = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ?", (user_id,))
return bool(len(result.fetchall())) return bool(len(result.fetchall()))
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_id_for_audio_record(self, user_id): def get_id_for_audio_record(self, user_id):
"""Получает ID аудио сообщения пользователя""" """Получает ID аудио сообщения пользователя"""
try: try:
result = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1", result = self.cursor.execute("SELECT `file_id` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1",
(user_id,)) (user_id,))
return result.fetchone()[0] return result.fetchone()[0]
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_path_for_audio_record(self, user_id): def get_path_for_audio_record(self, user_id):
"""Получает данные о названии файла""" """Получает данные о названии файла"""
try: try:
result = self.cursor.execute("SELECT `file_name` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1", (user_id,)) result = self.cursor.execute("SELECT `file_name` FROM `audio_message_reference` WHERE `author_id` = ? ORDER BY date_added DESC LIMIT 1", (user_id,))
return result.fetchone()[0] return result.fetchone()[0]
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def check_listen_audio(self, user_id): def check_listen_audio(self, user_id):
"""Проверяет прослушано ли аудио пользователем""" """Проверяет прослушано ли аудио пользователем"""
try: try:
query_listen_audio = self.cursor.execute( query_listen_audio = self.cursor.execute(
"""SELECT l.file_name """SELECT l.file_name
FROM audio_message_reference a FROM audio_message_reference a
LEFT JOIN listen_audio_users l ON l.file_name = a.file_name LEFT JOIN listen_audio_users l ON l.file_name = a.file_name
WHERE l.user_id = ? WHERE l.user_id = ?
AND l.file_name IS NOT NULL""" , (user_id,)) AND l.file_name IS NOT NULL""" , (user_id,))
check_sign = query_listen_audio.fetchall() check_sign = query_listen_audio.fetchall()
query_all_audio = self.cursor.execute('SELECT file_name FROM audio_message_reference WHERE author_id <> ?', (user_id,)) query_all_audio = self.cursor.execute('SELECT file_name FROM audio_message_reference WHERE author_id <> ?', (user_id,))
sign_all_audio = query_all_audio.fetchall() sign_all_audio = query_all_audio.fetchall()
new_sign1 = list(set(sign_all_audio) - set(check_sign)) new_sign1 = list(set(sign_all_audio) - set(check_sign))
new_sign = [] new_sign = []
for i in new_sign1: for i in new_sign1:
new_sign.append(i[0]) new_sign.append(i[0])
return new_sign return new_sign
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def mark_listened_audio(self, file_name, user_id): def mark_listened_audio(self, file_name, user_id):
"""Отмечает аудио прослушанным для конкретного пользователя.""" """Отмечает аудио прослушанным для конкретного пользователя."""
try: try:
result = self.cursor.execute("INSERT INTO `listen_audio_users` (file_name, user_id, is_listen) VALUES (?, ?, ?)", (file_name, user_id, 1)) result = self.cursor.execute("INSERT INTO `listen_audio_users` (file_name, user_id, is_listen) VALUES (?, ?, ?)", (file_name, user_id, 1))
return self.conn.commit() return self.conn.commit()
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def get_info_about_stickers(self, user_id): def get_info_about_stickers(self, user_id):
"""Получает данные о получении стикеров пользователем""" """Получает данные о получении стикеров пользователем"""
try: try:
result = self.cursor.execute("SELECT `has_stickers` FROM `our_users` WHERE `user_id` = ?", (user_id,)) result = self.cursor.execute("SELECT `has_stickers` FROM `our_users` WHERE `user_id` = ?", (user_id,))
return result.fetchone()[0] return result.fetchone()[0]
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def update_info_about_stickers(self, user_id): def update_info_about_stickers(self, user_id):
"""Обновляет данные о получении стикеров пользователем""" """Обновляет данные о получении стикеров пользователем"""
try: try:
result = self.cursor.execute("UPDATE `our_users` SET `has_stickers` = 1 WHERE `user_id` = ?", (user_id,)) result = self.cursor.execute("UPDATE `our_users` SET `has_stickers` = 1 WHERE `user_id` = ?", (user_id,))
return self.conn.commit() return self.conn.commit()
except sqlite3.Error as error: except sqlite3.Error as error:
print(error) print(error)
def close(self): def close(self):
"""Закрываем соединение с БД""" """Закрываем соединение с БД"""
self.conn.close() self.conn.close()

664
main.py
View File

@@ -1,325 +1,339 @@
import configparser import configparser
import os import os
import sys import sys
from pathlib import Path from pathlib import Path
from time import sleep from time import sleep
from db import BotDB from db import BotDB
import telebot import telebot
import random import random
from datetime import datetime from datetime import datetime
import time import time
from telebot import types from telebot import types
from telebot.apihelper import ApiTelegramException from telebot.apihelper import ApiTelegramException
#Настройки #Настройки
config_path = os.path.join(sys.path[0], 'settings.ini') config_path = os.path.join(sys.path[0], 'settings.ini')
config = configparser.ConfigParser() config = configparser.ConfigParser()
config.read(config_path) config.read(config_path)
#TELEGRAM #TELEGRAM
BOT_TOKEN = config.get('Telegram', 'BOT_TOKEN') BOT_TOKEN = config.get('Telegram', 'BOT_TOKEN')
GROUP_FOR_POST = config.get('Telegram', 'group_for_posts') GROUP_FOR_POST = config.get('Telegram', 'group_for_posts')
GROUP_FOR_MESSAGE = config.get('Telegram', 'group_for_message') GROUP_FOR_MESSAGE = config.get('Telegram', 'group_for_message')
MAIN_PUBLIC = config.get('Telegram', 'main_public') MAIN_PUBLIC = config.get('Telegram', 'main_public')
GROUP_FOR_LOGS = config.get('Telegram', 'group_for_logs') GROUP_FOR_LOGS = config.get('Telegram', 'group_for_logs')
IMPORTANT_LOGS = config.get('Telegram', 'important_logs') IMPORTANT_LOGS = config.get('Telegram', 'important_logs')
PREVIEW_LINK = config.getboolean('Telegram', 'PREVIEW_LINK') PREVIEW_LINK = config.getboolean('Telegram', 'PREVIEW_LINK')
#SETTINGS #SETTINGS
LOGS = config.getboolean('Settings', 'logs') LOGS = config.getboolean('Settings', 'logs')
TEST = config.getboolean('Settings', 'test') TEST = config.getboolean('Settings', 'test')
#Инициализируем бота и базку #Инициализируем бота и базку
bot = telebot.TeleBot(BOT_TOKEN, parse_mode=None) bot = telebot.TeleBot(BOT_TOKEN, parse_mode=None)
BotDB = BotDB('tg-bot-database') BotDB = BotDB('tg-bot-database')
def telegram_bot(): def telegram_bot():
@bot.message_handler(commands=['start']) @bot.message_handler(commands=['start'])
def send_welcome(message): def send_welcome(message):
#TODO: Здесь переписать через randint #TODO: Здесь переписать через randint
#TODO: Тексты приветствий вынести в отдельный файл #TODO: Тексты приветствий вынести в отдельный файл
try: try:
name_stick_hello = list(Path('Stick').rglob('Hello_*')) name_stick_hello = list(Path('Stick').rglob('Hello_*'))
number_stick_hello = random.randint(1, len(name_stick_hello)) number_stick_hello = random.randint(1, len(name_stick_hello))
random_stick_hello = open(name_stick_hello[number_stick_hello], 'rb') random_stick_hello = open(name_stick_hello[number_stick_hello], 'rb')
#logging #logging
if LOGS: if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS, bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id, from_chat_id=message.chat.id,
message_id=message.message_id) message_id=message.message_id)
bot.send_sticker(message.chat.id, random_stick_hello) bot.send_sticker(message.chat.id, random_stick_hello)
sleep(0.3) sleep(0.3)
except: except:
if LOGS: if LOGS:
bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(7)) bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(7))
try: try:
user_id = message.from_user.id user_id = message.from_user.id
first_name = message.from_user.first_name first_name = message.from_user.first_name
full_name = message.from_user.full_name full_name = message.from_user.full_name
is_bot = message.from_user.is_bot is_bot = message.from_user.is_bot
username = message.from_user.username username = message.from_user.username
language_code = message.from_user.language_code language_code = message.from_user.language_code
time_UTC = int(time.time()) time_UTC = int(time.time())
date_added = datetime.fromtimestamp(time_UTC) date_added = datetime.fromtimestamp(time_UTC)
date_changed = datetime.fromtimestamp(time_UTC) date_changed = datetime.fromtimestamp(time_UTC)
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("📢Предложить свой пост") item1 = types.KeyboardButton("📢Предложить свой пост")
item2 = types.KeyboardButton("📩Связаться с админами") item2 = types.KeyboardButton("📩Связаться с админами")
item3 = types.KeyboardButton("❌Удалить пост") # TODO: Выпилил, удалить
if BotDB.user_exists(user_id): #item3 = types.KeyboardButton("❌Удалить пост")
is_need_sticker = BotDB.get_info_about_stickers(user_id=message.from_user.id) if BotDB.user_exists(user_id):
if is_need_sticker == 0: is_need_sticker = BotDB.get_info_about_stickers(user_id=message.from_user.id)
item5 = types.KeyboardButton("🤪Хочу стикеры") if is_need_sticker == 0:
BotDB.update_info_about_stickers(user_id=message.from_user.id) item5 = types.KeyboardButton("🤪Хочу стикеры")
markup.add(item1, item2, item3, item5) BotDB.update_info_about_stickers(user_id=message.from_user.id)
else: markup.add(item1, item2, item5)
markup.add(item1, item2, item3) else:
else: markup.add(item1, item2)
BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, date_added, date_changed) else:
is_need_sticker = BotDB.get_info_about_stickers(user_id=message.from_user.id) BotDB.add_new_user_in_db(user_id, first_name, full_name, username, is_bot, language_code, date_added, date_changed)
if is_need_sticker == 0: is_need_sticker = BotDB.get_info_about_stickers(user_id=message.from_user.id)
item5 = types.KeyboardButton("🤪Хочу стикеры") if is_need_sticker == 0:
BotDB.update_info_about_stickers(user_id=message.from_user.id) item5 = types.KeyboardButton("🤪Хочу стикеры")
markup.add(item1, item2, item3, item5) BotDB.update_info_about_stickers(user_id=message.from_user.id)
else: markup.add(item1, item2, item5)
markup.add(item1, item2, item3) else:
hello_message = BotDB.get_message_from_db('start_message', first_name) markup.add(item1, item2)
bot.send_message(message.chat.id, hello_message, parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK) hello_message = BotDB.get_message_from_db('start_message', first_name)
except: bot.send_message(message.chat.id, hello_message, parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK)
if LOGS: except:
bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(8)) if LOGS:
bot.register_next_step_handler(message, go_send_messages) bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(8))
bot.register_next_step_handler(message, go_send_messages)
@bot.message_handler(commands=['end_command'])
def after_post(message): @bot.message_handler(commands=['end_command'])
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) def after_post(message):
item1 = types.KeyboardButton("📢Предложить свой пост") markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item2 = types.KeyboardButton("📩Связаться с админами") item1 = types.KeyboardButton("📢Предложить свой пост")
item3 = types.KeyboardButton("❌Удалить пост") item2 = types.KeyboardButton("📩Связаться с админами")
item5 = types.KeyboardButton("👋🏼Сказать пока!") # TODO: Скрыл, удалить обработчик
markup.add(item1, item2, item3, item5) #item3 = types.KeyboardButton("❌Удалить пост")
bot.send_message(message.chat.id, item5 = types.KeyboardButton("👋🏼Сказать пока!")
"Выбери нужную кнопку внизу экрана".format( markup.add(item1, item2, item5)
message.from_user, bot.get_me()), bot.send_message(message.chat.id,
parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK) "Выбери нужную кнопку внизу экрана".format(
bot.register_next_step_handler(message, go_send_messages) message.from_user, bot.get_me()),
parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK)
def go_send_messages(message): bot.register_next_step_handler(message, go_send_messages)
global msg
if message.text == '📢Предложить свой пост': def go_send_messages(message):
try: global msg
markup = types.ReplyKeyboardRemove() if message.text == '📢Предложить свой пост':
first_name = message.from_user.first_name try:
suggest_news = BotDB.get_message_from_db('suggest_news', first_name) markup = types.ReplyKeyboardRemove()
bot.send_message(message.chat.id, suggest_news, parse_mode='html') first_name = message.from_user.first_name
sleep(0.3) suggest_news = BotDB.get_message_from_db('suggest_news', first_name)
first_name = message.from_user.first_name bot.send_message(message.chat.id, suggest_news, parse_mode='html')
suggest_news_2 = BotDB.get_message_from_db('suggest_news_2', first_name) sleep(0.3)
msg = bot.send_message(message.chat.id, suggest_news_2,parse_mode='html', reply_markup=markup) first_name = message.from_user.first_name
except: suggest_news_2 = BotDB.get_message_from_db('suggest_news_2', first_name)
if LOGS: msg = bot.send_message(message.chat.id, suggest_news_2,parse_mode='html', reply_markup=markup)
bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(10)) except:
#logging if LOGS:
if LOGS: bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(10))
bot.forward_message(chat_id=GROUP_FOR_LOGS, #logging
from_chat_id=message.chat.id, if LOGS:
message_id=message.message_id) bot.forward_message(chat_id=GROUP_FOR_LOGS,
bot.register_next_step_handler(msg, resend_message_in_group_for_post) from_chat_id=message.chat.id,
message_id=message.message_id)
elif message.text == "📩Связаться с админами": bot.register_next_step_handler(msg, resend_message_in_group_for_post)
first_name = message.from_user.first_name
connect_with_admin = BotDB.get_message_from_db('connect_with_admin', first_name) elif message.text == "📩Связаться с админами":
msg = bot.send_message(message.chat.id, connect_with_admin, parse_mode="html") first_name = message.from_user.first_name
#logging connect_with_admin = BotDB.get_message_from_db('connect_with_admin', first_name)
if LOGS: msg = bot.send_message(message.chat.id, connect_with_admin, parse_mode="html")
bot.forward_message(chat_id=GROUP_FOR_LOGS, #logging
from_chat_id=message.chat.id, if LOGS:
message_id=message.message_id) bot.forward_message(chat_id=GROUP_FOR_LOGS,
bot.register_next_step_handler(msg, resend_message_in_group_for_message) from_chat_id=message.chat.id,
message_id=message.message_id)
bot.register_next_step_handler(msg, resend_message_in_group_for_message)
elif message.text == "❌Удалить пост":
#TODO: требует автоматизации. На входе говорим пришли мне пост, на выходе получаем идентификатор поста, удаляем из ТГ. Насчет удаления из ВК надо подумать
first_name = message.from_user.first_name elif message.text == "❌Удалить пост":
del_message = BotDB.get_message_from_db('del_message', first_name) #TODO: требует автоматизации. На входе говорим пришли мне пост, на выходе получаем идентификатор поста, удаляем из ТГ. Насчет удаления из ВК надо подумать
msg = bot.send_message(message.chat.id, del_message, parse_mode="html") first_name = message.from_user.first_name
#logging del_message = BotDB.get_message_from_db('del_message', first_name)
if LOGS: msg = bot.send_message(message.chat.id, del_message, parse_mode="html")
bot.forward_message(chat_id=GROUP_FOR_LOGS, #logging
from_chat_id=message.chat.id, if LOGS:
message_id=message.message_id) bot.forward_message(chat_id=GROUP_FOR_LOGS,
bot.register_next_step_handler(msg, resend_message_in_group_for_message) from_chat_id=message.chat.id,
message_id=message.message_id)
elif message.text == "👋🏼Сказать пока!": bot.register_next_step_handler(msg, resend_message_in_group_for_message)
try:
name_stick_bye = list(Path('Stick').rglob('Universal_*')) elif message.text == "👋🏼Сказать пока!":
number_stick_bye = random.randint(1, len(name_stick_bye)) try:
random_stick_bye = open(name_stick_bye[number_stick_bye], 'rb') name_stick_bye = list(Path('Stick').rglob('Universal_*'))
bot.send_sticker(message.chat.id, random_stick_bye) number_stick_bye = random.randint(1, len(name_stick_bye))
except ApiTelegramException: random_stick_bye = open(name_stick_bye[number_stick_bye], 'rb')
if LOGS: bot.send_sticker(message.chat.id, random_stick_bye)
bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(11)) except ApiTelegramException:
if LOGS:
markup = types.ReplyKeyboardRemove() bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(11))
try:
first_name = message.from_user.first_name markup = types.ReplyKeyboardRemove()
bye_message = BotDB.get_message_from_db('bye_message', first_name) try:
bot.send_message(message.chat.id, bye_message, first_name = message.from_user.first_name
parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK) bye_message = BotDB.get_message_from_db('bye_message', first_name)
except: bot.send_message(message.chat.id, bye_message,
if LOGS: parse_mode='html', reply_markup=markup, disable_web_page_preview=not PREVIEW_LINK)
bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(6)) except:
if LOGS:
if LOGS: bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(6))
#logging
bot.forward_message(chat_id=GROUP_FOR_LOGS, if LOGS:
from_chat_id=message.chat.id, #logging
message_id=message.message_id) bot.forward_message(chat_id=GROUP_FOR_LOGS,
elif message.text == "🤪Хочу стикеры": from_chat_id=message.chat.id,
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) message_id=message.message_id)
item1 = types.KeyboardButton("📢Предложить свой пост") elif message.text == "🤪Хочу стикеры":
item2 = types.KeyboardButton("📩Связаться с админами") markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item3 = types.KeyboardButton("❌Удалить пост") item1 = types.KeyboardButton("📢Предложить свой пост")
item5 = types.KeyboardButton("👋🏼Сказать пока!") item2 = types.KeyboardButton("📩Связаться с админами")
markup.add(item1, item2, item3, item5) # TODO: Скрыл кнопку, убрать обработчик позднее
try: #item3 = types.KeyboardButton("❌Удалить пост")
if LOGS: item5 = types.KeyboardButton("👋🏼Сказать пока!")
bot.forward_message(chat_id=GROUP_FOR_LOGS, markup.add(item1, item2, item5)
from_chat_id=message.chat.id, try:
message_id=message.message_id) if LOGS:
bot.send_message(message.chat.id, text='Хорошо, лови, добавить можно отсюда: https://t.me/addstickers/love_biysk', reply_markup=markup) bot.forward_message(chat_id=GROUP_FOR_LOGS,
bot.register_next_step_handler(message, callback=go_send_messages) from_chat_id=message.chat.id,
except ApiTelegramException: message_id=message.message_id)
if LOGS: bot.send_message(message.chat.id, text='Хорошо, лови, добавить можно отсюда: https://t.me/addstickers/love_biysk', reply_markup=markup)
bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(12)) bot.register_next_step_handler(message, callback=go_send_messages)
else: except ApiTelegramException:
try: if LOGS:
first_name = message.from_user.first_name bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(12))
user_error = BotDB.get_message_from_db('user_error', first_name) else:
bot.send_message(message.chat.id, user_error, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK) try:
except: first_name = message.from_user.first_name
if LOGS: user_error = BotDB.get_message_from_db('user_error', first_name)
bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(9)) bot.send_message(message.chat.id, user_error, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK)
#logging except:
if LOGS: if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS, bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(9))
from_chat_id=message.chat.id, #logging
message_id=message.message_id) if LOGS:
bot.register_next_step_handler(message, callback=go_send_messages) bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id,
def resend_message_in_group_for_post(message): message_id=message.message_id)
markup = types.InlineKeyboardMarkup(row_width=1) bot.register_next_step_handler(message, callback=go_send_messages)
item1 = types.InlineKeyboardButton("Опубликовать", callback_data='post_post_post')
item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline') def resend_message_in_group_for_post(message):
markup.add(item1, item2) markup = types.InlineKeyboardMarkup(row_width=1)
try: item1 = types.InlineKeyboardButton("Опубликовать", callback_data='post_post_post')
if message.content_type == 'text': item2 = types.InlineKeyboardButton("Отклонить", callback_data='decline')
post_text = message.text.lower() markup.add(item1, item2)
if post_text.find('неанон') != -1 or post_text.find('не анон') != -1: try:
bot.send_message( if message.content_type == 'text':
#TODO: GROUP_FOR_POST post_text = message.text.lower()
chat_id=GROUP_FOR_POST, if post_text.find('неанон') != -1 or post_text.find('не анон') != -1:
text=f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}', bot.send_message(
reply_markup=markup #TODO: GROUP_FOR_POST
) chat_id=GROUP_FOR_POST,
elif post_text.find('анон') != -1: text=f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
bot.send_message( reply_markup=markup
# TODO: GROUP_FOR_POST )
chat_id=GROUP_FOR_POST, elif post_text.find('анон') != -1:
text=f'Пост из ТГ:\n{message.text}\n\nПост опубликован анонимно', bot.send_message(
reply_markup=markup # TODO: GROUP_FOR_POST
) chat_id=GROUP_FOR_POST,
else: text=f'Пост из ТГ:\n{message.text}\n\nПост опубликован анонимно',
bot.send_message( reply_markup=markup
# TODO: GROUP_FOR_POST )
chat_id=GROUP_FOR_POST, else:
text=f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}', bot.send_message(
reply_markup=markup # TODO: GROUP_FOR_POST
) chat_id=GROUP_FOR_POST,
elif message.content_type == 'photo' and message.media_group_id == None: text=f'Пост из ТГ:\n{post_text}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
post_text_for_photo = message.caption.lower() reply_markup=markup
bot.send_photo( )
# TODO: GROUP_FOR_POST elif message.content_type == 'photo' and message.media_group_id == None:
chat_id=GROUP_FOR_POST, post_text_for_photo = message.caption.lower()
caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}', if post_text_for_photo.find('неанон') != -1 or post_text_for_photo.find('не анон') != -1:
photo=message.photo[-1].file_id, bot.send_photo(
reply_markup=markup # TODO: GROUP_FOR_POST
) chat_id=GROUP_FOR_POST,
#TODO: Не понятна реализация с альбомами от слова совсем caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
#elif message.content_type == 'photo' and message.media_group_id != None: photo=message.photo[-1].file_id,
# bot.forward_message(chat_id=IMPORTANT_LOGS, from_chat_id=message.chat.id, message_id=message.message_id ) reply_markup=markup
else: )
pass elif post_text_for_photo.find('анон') != -1 or post_text_for_photo.find('анон') != -1:
except: bot.send_photo(
if LOGS: # TODO: GROUP_FOR_POST
username = message.from_user.first_name chat_id=GROUP_FOR_POST,
error_message = str(BotDB.get_error_message_from_db(5)).replace('username', username) caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nПост опубликован анонимно',
bot.send_message(chat_id=IMPORTANT_LOGS, text=error_message) photo=message.photo[-1].file_id,
reply_markup=markup
username = message.from_user.first_name )
success_send_message = BotDB.get_message_from_db('success_send_message', username) else:
bot.send_photo(
bot.send_message(message.chat.id, success_send_message, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK) # TODO: GROUP_FOR_POST
after_post(message=message) chat_id=GROUP_FOR_POST,
caption=f'Пост из ТГ:\n{post_text_for_photo}\n\nАвтор поста: {message.from_user.first_name} @{message.from_user.username}',
def resend_message_in_group_for_message(message): photo=message.photo[-1].file_id,
bot.forward_message(chat_id=GROUP_FOR_MESSAGE, reply_markup=markup
from_chat_id=message.chat.id, )
message_id=message.message_id #TODO: Не понятна реализация с альбомами от слова совсем
) #elif message.content_type == 'photo' and message.media_group_id != None:
username = message.from_user.first_name # bot.forward_message(chat_id=IMPORTANT_LOGS, from_chat_id=message.chat.id, message_id=message.message_id )
question = BotDB.get_message_from_db('question', username) else:
bot.send_message(message.chat.id, question, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK) pass
try: except:
pass if LOGS:
except: username = message.from_user.first_name
if LOGS: error_message = str(BotDB.get_error_message_from_db(5)).replace('username', username)
bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(4)) bot.send_message(chat_id=IMPORTANT_LOGS, text=error_message)
after_post(message=message)
username = message.from_user.first_name
success_send_message = BotDB.get_message_from_db('success_send_message', username)
#Админка
@bot.callback_query_handler(func=lambda call: True) bot.send_message(message.chat.id, success_send_message, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK)
def post_for_group(call): after_post(message=message)
if call.data == 'post_post_post' and call.message.content_type == 'text':
try: def resend_message_in_group_for_message(message):
bot.send_message(chat_id=MAIN_PUBLIC, text=call.message.text) bot.forward_message(chat_id=GROUP_FOR_MESSAGE,
bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) from_chat_id=message.chat.id,
except: message_id=message.message_id
if LOGS: )
bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(3)) username = message.from_user.first_name
elif call.data == 'post_post_post' and call.message.content_type == 'photo': question = BotDB.get_message_from_db('question', username)
try: bot.send_message(message.chat.id, question, parse_mode='html', disable_web_page_preview=not PREVIEW_LINK)
bot.send_photo( try:
chat_id=MAIN_PUBLIC, pass
caption=call.message.caption, except:
photo=call.message.photo[-1].file_id, if LOGS:
) bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(4))
bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) after_post(message=message)
except:
if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(2)) #Админка
elif call.data == 'decline': @bot.callback_query_handler(func=lambda call: True)
try: def post_for_group(call):
bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id) if call.data == 'post_post_post' and call.message.content_type == 'text':
except: try:
if LOGS: bot.send_message(chat_id=MAIN_PUBLIC, text=call.message.text)
bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(1)) bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
except:
if LOGS:
if __name__ == '__main__': bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(3))
telegram_bot() elif call.data == 'post_post_post' and call.message.content_type == 'photo':
try: try:
bot.polling(none_stop=True) bot.send_photo(
bot.enable_save_next_step_handlers(delay=2) chat_id=MAIN_PUBLIC,
bot.load_next_step_handlers() caption=call.message.caption,
except ConnectionError as e: photo=call.message.photo[-1].file_id,
if LOGS: )
bot.send_message(IMPORTANT_LOGS, "Ошибка соединения, потерял связь") bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
except Exception as r: except:
if LOGS: if LOGS:
bot.send_message(IMPORTANT_LOGS, "Произошло что-то непредвиденное, хелп") bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(2))
finally: elif call.data == 'decline':
if LOGS: try:
bot.send_message(IMPORTANT_LOGS, 'Я упал, помогите') bot.delete_message(chat_id=GROUP_FOR_POST, message_id=call.message.message_id)
except:
if LOGS:
bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(1))
if __name__ == '__main__':
telegram_bot()
while True:
try:
bot.polling(none_stop=True)
bot.enable_save_next_step_handlers(delay=2)
bot.load_next_step_handlers()
except (ConnectionError, Exception):
print("Произошла ошибка, перезапуск бота")

View File

@@ -1,9 +1,9 @@
[Telegram] [Telegram]
bot_token = 5719450198:AAEI6hQgwiIcxMLGvVrPdopWqVlwHqR0QoU bot_token = 5719450198:AAEI6hQgwiIcxMLGvVrPdopWqVlwHqR0QoU
preview_link = false preview_link = false
main_public = @love_biysk main_public = @love_biysk
group_for_posts = -793789724 group_for_posts = -793789724
group_for_message = -736077298 group_for_message = -736077298
group_for_logs = -721685792 group_for_logs = -721685792
important_logs = -625900899 important_logs = -625900899
test_channel = -1001725605158 test_channel = -1001725605158

View File

@@ -1,318 +1,318 @@
import configparser import configparser
import os import os
import sys import sys
from pathlib import Path from pathlib import Path
from time import sleep from time import sleep
import db import db
from db import BotDB from db import BotDB
import telebot import telebot
import random import random
from datetime import datetime from datetime import datetime
import time import time
from telebot import types from telebot import types
#Настройки #Настройки
config_path = os.path.join(sys.path[0], 'settings.ini') config_path = os.path.join(sys.path[0], 'settings.ini')
config = configparser.ConfigParser() config = configparser.ConfigParser()
config.read(config_path) config.read(config_path)
#TELEGRAM #TELEGRAM
BOT_TOKEN = config.get('Telegram', 'listen_bot_token') BOT_TOKEN = config.get('Telegram', 'listen_bot_token')
GROUP_FOR_POST = config.get('Telegram', 'group_for_posts') GROUP_FOR_POST = config.get('Telegram', 'group_for_posts')
GROUP_FOR_MESSAGE = config.get('Telegram', 'group_for_message') GROUP_FOR_MESSAGE = config.get('Telegram', 'group_for_message')
MAIN_PUBLIC = config.get('Telegram', 'main_public') MAIN_PUBLIC = config.get('Telegram', 'main_public')
GROUP_FOR_LOGS = config.get('Telegram', 'group_for_logs') GROUP_FOR_LOGS = config.get('Telegram', 'group_for_logs')
IMPORTANT_LOGS = config.get('Telegram', 'important_logs') IMPORTANT_LOGS = config.get('Telegram', 'important_logs')
PREVIEW_LINK = config.getboolean('Telegram', 'PREVIEW_LINK') PREVIEW_LINK = config.getboolean('Telegram', 'PREVIEW_LINK')
#SETTINGS #SETTINGS
LOGS = config.getboolean('Settings', 'logs') LOGS = config.getboolean('Settings', 'logs')
TEST = config.getboolean('Settings', 'test') TEST = config.getboolean('Settings', 'test')
#Инициализируем бота и базку #Инициализируем бота и базку
bot = telebot.TeleBot(BOT_TOKEN, parse_mode=None) bot = telebot.TeleBot(BOT_TOKEN, parse_mode=None)
BotDB = BotDB('tg-bot-database') BotDB = BotDB('tg-bot-database')
def telegram_bot(): def telegram_bot():
@bot.message_handler(commands=['start']) @bot.message_handler(commands=['start'])
def send_welcome(message): def send_welcome(message):
try: try:
name_stick_hello = list(Path('Stick').rglob('Hello_*')) name_stick_hello = list(Path('Stick').rglob('Hello_*'))
number_stick_hello = random.randint(1, len(name_stick_hello)) number_stick_hello = random.randint(1, len(name_stick_hello))
random_stick_hello = open(name_stick_hello[number_stick_hello], 'rb') random_stick_hello = open(name_stick_hello[number_stick_hello], 'rb')
#logging #logging
if LOGS: if LOGS:
bot.forward_message(chat_id=GROUP_FOR_LOGS, bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id, from_chat_id=message.chat.id,
message_id=message.message_id) message_id=message.message_id)
bot.send_sticker(message.chat.id, random_stick_hello) bot.send_sticker(message.chat.id, random_stick_hello)
sleep(0.3) sleep(0.3)
except: except:
if LOGS: if LOGS:
bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(7)) bot.send_message(IMPORTANT_LOGS, BotDB.get_error_message_from_db(7))
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("🎤Высказаться") item1 = types.KeyboardButton("🎤Высказаться")
item2 = types.KeyboardButton("🎧Послушать") item2 = types.KeyboardButton("🎧Послушать")
markup.add(item1, item2) markup.add(item1, item2)
bot.send_message(message.chat.id, "<b>Привет.</b>", parse_mode='html', reply_markup=markup, bot.send_message(message.chat.id, "<b>Привет.</b>", parse_mode='html', reply_markup=markup,
disable_web_page_preview=not PREVIEW_LINK) disable_web_page_preview=not PREVIEW_LINK)
time.sleep(0.3) time.sleep(0.3)
bot.send_message(message.chat.id, "<i>Здесь можно послушать голосовые сообщения от совершенно незнакомых людей из Бийска</i>", parse_mode='html', reply_markup=markup, bot.send_message(message.chat.id, "<i>Здесь можно послушать голосовые сообщения от совершенно незнакомых людей из Бийска</i>", parse_mode='html', reply_markup=markup,
disable_web_page_preview=not PREVIEW_LINK) disable_web_page_preview=not PREVIEW_LINK)
time.sleep(1) time.sleep(1)
bot.send_message(message.chat.id, "Это почти как написать письмо, положить его в бутылку и швырнуть в океан. Никогда не узнаешь, послушал его кто-то или нет и ответить тоже не получится..", parse_mode='html', reply_markup=markup, bot.send_message(message.chat.id, "Это почти как написать письмо, положить его в бутылку и швырнуть в океан. Никогда не узнаешь, послушал его кто-то или нет и ответить тоже не получится..", parse_mode='html', reply_markup=markup,
disable_web_page_preview=not PREVIEW_LINK) disable_web_page_preview=not PREVIEW_LINK)
time.sleep(0.8) time.sleep(0.8)
bot.send_message(message.chat.id, "Записывать можно всё что угодно — никаких правил нет. Главное — твой голос, <i>хотя бы на 5-10 секунд</i>", parse_mode='html', reply_markup=markup, bot.send_message(message.chat.id, "Записывать можно всё что угодно — никаких правил нет. Главное — твой голос, <i>хотя бы на 5-10 секунд</i>", parse_mode='html', reply_markup=markup,
disable_web_page_preview=not PREVIEW_LINK) disable_web_page_preview=not PREVIEW_LINK)
time.sleep(1.5) time.sleep(1.5)
bot.send_message(message.chat.id, "Здесь всё анонимно: тот, кому я отправлю твое сообщение, не узнает ни твое имя, ни твой аккаунт (так что можно не стесняться говорить то, что не стал(а) бы выкладывать в собственные соцсети)", parse_mode='html', reply_markup=markup, bot.send_message(message.chat.id, "Здесь всё анонимно: тот, кому я отправлю твое сообщение, не узнает ни твое имя, ни твой аккаунт (так что можно не стесняться говорить то, что не стал(а) бы выкладывать в собственные соцсети)", parse_mode='html', reply_markup=markup,
disable_web_page_preview=not PREVIEW_LINK) disable_web_page_preview=not PREVIEW_LINK)
time.sleep(1.3) time.sleep(1.3)
bot.send_message(message.chat.id, "Если не знаешь, что сказать, можешь просто прочитать любое текстовое сообщение из недавно полученных или отправленных (или спеть, рассказать стихотворенье)", parse_mode='html', reply_markup=markup, bot.send_message(message.chat.id, "Если не знаешь, что сказать, можешь просто прочитать любое текстовое сообщение из недавно полученных или отправленных (или спеть, рассказать стихотворенье)", parse_mode='html', reply_markup=markup,
disable_web_page_preview=not PREVIEW_LINK) disable_web_page_preview=not PREVIEW_LINK)
time.sleep(0.8) time.sleep(0.8)
bot.send_message(message.chat.id, bot.send_message(message.chat.id,
"Так же можешь ознакомиться с инструкцией к боту по команде /help", "Так же можешь ознакомиться с инструкцией к боту по команде /help",
parse_mode='html', reply_markup=markup, parse_mode='html', reply_markup=markup,
disable_web_page_preview=not PREVIEW_LINK) disable_web_page_preview=not PREVIEW_LINK)
time.sleep(0.8) time.sleep(0.8)
msg = bot.send_message(message.chat.id, "<b>ну всё, достаточно инструкций. записывайся! Микрофон твой - </b> 🎤", parse_mode='html', reply_markup=markup, msg = bot.send_message(message.chat.id, "<b>ну всё, достаточно инструкций. записывайся! Микрофон твой - </b> 🎤", parse_mode='html', reply_markup=markup,
disable_web_page_preview=not PREVIEW_LINK) disable_web_page_preview=not PREVIEW_LINK)
bot.register_next_step_handler(msg, standup) bot.register_next_step_handler(msg, standup)
def last_message(): def last_message():
# функция с отображением сообщения "Последнее сообщение было записано" # функция с отображением сообщения "Последнее сообщение было записано"
date_from_db = BotDB.last_date_audio() date_from_db = BotDB.last_date_audio()
parse_date = datetime.strptime(date_from_db, "%Y-%m-%d %H:%M:%S") parse_date = datetime.strptime(date_from_db, "%Y-%m-%d %H:%M:%S")
last_voice_time_timestamp = time.mktime(parse_date.timetuple()) last_voice_time_timestamp = time.mktime(parse_date.timetuple())
time_now_timestamp = time.time() time_now_timestamp = time.time()
date_difference = time_now_timestamp - last_voice_time_timestamp date_difference = time_now_timestamp - last_voice_time_timestamp
# считаем минуты, часы, дни # считаем минуты, часы, дни
much_minutes_ago = round(date_difference / 60, 0) much_minutes_ago = round(date_difference / 60, 0)
much_hour_ago = round(date_difference / 3600, 0) much_hour_ago = round(date_difference / 3600, 0)
much_days_ago = int(round(much_hour_ago / 24, 0)) much_days_ago = int(round(much_hour_ago / 24, 0))
message_with_date = '' message_with_date = ''
if much_minutes_ago <= 60: if much_minutes_ago <= 60:
word_minute = plural_time(1, much_minutes_ago) word_minute = plural_time(1, much_minutes_ago)
message_with_date = f'<b>Последнее сообщение было записано {word_minute} назад</b>' message_with_date = f'<b>Последнее сообщение было записано {word_minute} назад</b>'
elif much_minutes_ago > 60 and much_hour_ago <= 24: elif much_minutes_ago > 60 and much_hour_ago <= 24:
word_hour = plural_time(2, much_hour_ago) word_hour = plural_time(2, much_hour_ago)
message_with_date = f'<b>Последнее сообщение было записано {word_hour} назад</b>' message_with_date = f'<b>Последнее сообщение было записано {word_hour} назад</b>'
elif much_hour_ago > 24: elif much_hour_ago > 24:
word_day = plural_time(3, much_days_ago) word_day = plural_time(3, much_days_ago)
message_with_date = f'<b>Последнее сообщение было записано {word_day} назад</b>' message_with_date = f'<b>Последнее сообщение было записано {word_day} назад</b>'
return message_with_date return message_with_date
def standup(message): def standup(message):
# Клавиатуру добавляем # Клавиатуру добавляем
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("🎤Высказаться") item1 = types.KeyboardButton("🎤Высказаться")
item2 = types.KeyboardButton("🎧Послушать") item2 = types.KeyboardButton("🎧Послушать")
markup.add(item1, item2) markup.add(item1, item2)
try: try:
if message.text == '🎤Высказаться': if message.text == '🎤Высказаться':
markup = types.ReplyKeyboardRemove() markup = types.ReplyKeyboardRemove()
if LOGS: if LOGS:
# logging # logging
bot.forward_message(chat_id=GROUP_FOR_LOGS, bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id, from_chat_id=message.chat.id,
message_id=message.message_id) message_id=message.message_id)
if TEST: if TEST:
bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id)
bot.send_message(chat_id=message.chat.id, text='Хорошо, теперь пришли мне свое голосовое сообщение', reply_markup=markup) bot.send_message(chat_id=message.chat.id, text='Хорошо, теперь пришли мне свое голосовое сообщение', reply_markup=markup)
message_with_date = last_message() message_with_date = last_message()
msg = bot.send_message(chat_id=message.chat.id, text=message_with_date, parse_mode="html") msg = bot.send_message(chat_id=message.chat.id, text=message_with_date, parse_mode="html")
bot.register_next_step_handler(msg, save_voice_message) bot.register_next_step_handler(msg, save_voice_message)
elif message.text == '🎧Послушать': elif message.text == '🎧Послушать':
check_audio = BotDB.check_listen_audio(user_id=message.from_user.id) check_audio = BotDB.check_listen_audio(user_id=message.from_user.id)
list_audio = list(check_audio) list_audio = list(check_audio)
if TEST: if TEST:
bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id)
if list_audio == []: if list_audio == []:
bot.send_message(message.chat.id, 'Прости, ты прослушал все аудио😔. Возвращайся позже, возможно наша база пополнится', reply_markup=markup) bot.send_message(message.chat.id, 'Прости, ты прослушал все аудио😔. Возвращайся позже, возможно наша база пополнится', reply_markup=markup)
message_with_date = last_message() message_with_date = last_message()
msg = bot.send_message(chat_id=message.chat.id, text=message_with_date, parse_mode="html") msg = bot.send_message(chat_id=message.chat.id, text=message_with_date, parse_mode="html")
bot.register_next_step_handler(msg, standup) bot.register_next_step_handler(msg, standup)
else: else:
number_element = random.randint(0, len(list_audio) - 1) number_element = random.randint(0, len(list_audio) - 1)
audio_for_user = check_audio[number_element] audio_for_user = check_audio[number_element]
path = Path(f'voice_users/{audio_for_user}.ogg') path = Path(f'voice_users/{audio_for_user}.ogg')
voice = open(path, 'rb') voice = open(path, 'rb')
#Маркируем сообщение как прослушанное #Маркируем сообщение как прослушанное
BotDB.mark_listened_audio(audio_for_user, user_id=message.from_user.id) BotDB.mark_listened_audio(audio_for_user, user_id=message.from_user.id)
msg = bot.send_voice(message.chat.id, voice=voice, reply_markup=markup) msg = bot.send_voice(message.chat.id, voice=voice, reply_markup=markup)
bot.register_next_step_handler(msg, standup) bot.register_next_step_handler(msg, standup)
if LOGS: if LOGS:
# logging # logging
bot.forward_message(chat_id=GROUP_FOR_LOGS, bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id, from_chat_id=message.chat.id,
message_id=message.message_id) message_id=message.message_id)
if TEST: if TEST:
bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id)
elif message.text == '/restart': elif message.text == '/restart':
msg = bot.send_message(message.chat.id, 'Я перезапущен, и готов к работе🥳', reply_markup=markup) msg = bot.send_message(message.chat.id, 'Я перезапущен, и готов к работе🥳', reply_markup=markup)
bot.forward_message(chat_id=GROUP_FOR_LOGS, bot.forward_message(chat_id=GROUP_FOR_LOGS,
from_chat_id=message.chat.id, from_chat_id=message.chat.id,
message_id=message.message_id) message_id=message.message_id)
bot.register_next_step_handler(msg, standup) bot.register_next_step_handler(msg, standup)
elif message.text == '/help': elif message.text == '/help':
help_function(message) help_function(message)
else: else:
msg = bot.send_message(chat_id=message.chat.id, text='Я тебя не понял, воспользуйся меню', reply_markup=markup) msg = bot.send_message(chat_id=message.chat.id, text='Я тебя не понял, воспользуйся меню', reply_markup=markup)
bot.register_next_step_handler(msg, standup) bot.register_next_step_handler(msg, standup)
except: except:
if LOGS: if LOGS:
bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(4)) bot.send_message(chat_id=IMPORTANT_LOGS, text=BotDB.get_error_message_from_db(4))
def plural_time(type, n): def plural_time(type, n):
word = [] word = []
if type == 1: if type == 1:
word = ['минуту', 'минуты', 'минут'] word = ['минуту', 'минуты', 'минут']
elif type == 2: elif type == 2:
word = ['час', 'часа', 'часов'] word = ['час', 'часа', 'часов']
elif type == 3: elif type == 3:
word = ['день', 'дня', 'дней'] word = ['день', 'дня', 'дней']
else: else:
pass pass
if n % 10 == 1 and n % 100 != 11: if n % 10 == 1 and n % 100 != 11:
p = 0 p = 0
elif 2 <= n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20): elif 2 <= n % 10 <= 4 and (n % 100 < 10 or n % 100 >= 20):
p = 1 p = 1
else: else:
p = 2 p = 2
new_number = int(n) new_number = int(n)
return str(new_number) + ' ' + word[p] return str(new_number) + ' ' + word[p]
def save_voice_message(message): def save_voice_message(message):
if message.content_type == 'voice': if message.content_type == 'voice':
if TEST: if TEST:
bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id)
file_name = '' file_name = ''
file_id = 1 file_id = 1
#Проверяем что запись о файле есть в базе данных #Проверяем что запись о файле есть в базе данных
is_having_audio_from_user = BotDB.get_last_user_audio_record(user_id=message.from_user.id) is_having_audio_from_user = BotDB.get_last_user_audio_record(user_id=message.from_user.id)
if is_having_audio_from_user is False: if is_having_audio_from_user is False:
#Если нет, то генерируем имя файла #Если нет, то генерируем имя файла
file_name = f'message_from_{message.from_user.id}_number_{file_id}' file_name = f'message_from_{message.from_user.id}_number_{file_id}'
else: else:
#Иначе берем последнюю запись из БД, добавляем к ней 1, и создаем новую запись #Иначе берем последнюю запись из БД, добавляем к ней 1, и создаем новую запись
file_name = BotDB.get_path_for_audio_record(user_id=message.from_user.id) file_name = BotDB.get_path_for_audio_record(user_id=message.from_user.id)
file_id = BotDB.get_id_for_audio_record(message.from_user.id) + 1 file_id = BotDB.get_id_for_audio_record(message.from_user.id) + 1
path = Path(f'voice_users/{file_name}.ogg') path = Path(f'voice_users/{file_name}.ogg')
if path.exists(): if path.exists():
file_name = f'message_from_{message.from_user.id}_number_{file_id}' file_name = f'message_from_{message.from_user.id}_number_{file_id}'
else: else:
pass pass
#Собираем инфо о сообщении #Собираем инфо о сообщении
author_id = message.from_user.id author_id = message.from_user.id
time_UTC = int(time.time()) time_UTC = int(time.time())
date_added = datetime.fromtimestamp(time_UTC) date_added = datetime.fromtimestamp(time_UTC)
#Сохраняем в базку #Сохраняем в базку
BotDB.add_audio_record(file_name, author_id, date_added, 0, file_id) BotDB.add_audio_record(file_name, author_id, date_added, 0, file_id)
#Сохраняем файл на сервер #Сохраняем файл на сервер
file_info = bot.get_file(message.voice.file_id) file_info = bot.get_file(message.voice.file_id)
downloaded_file = bot.download_file(file_info.file_path) downloaded_file = bot.download_file(file_info.file_path)
with open(f'voice_users/{file_name}.ogg', 'wb') as new_file: with open(f'voice_users/{file_name}.ogg', 'wb') as new_file:
new_file.write(downloaded_file) new_file.write(downloaded_file)
#инициализируем кнопки #инициализируем кнопки
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("🎤Высказаться") item1 = types.KeyboardButton("🎤Высказаться")
item2 = types.KeyboardButton("🎧Послушать") item2 = types.KeyboardButton("🎧Послушать")
markup.add(item1, item2) markup.add(item1, item2)
bot.send_message(chat_id=message.chat.id, text='Окей, сохранил!👌', reply_markup=markup) bot.send_message(chat_id=message.chat.id, text='Окей, сохранил!👌', reply_markup=markup)
#menu_standup(message=message) #menu_standup(message=message)
bot.register_next_step_handler(message, standup) bot.register_next_step_handler(message, standup)
else: else:
#TODO: Если пришлют фото, он не работает #TODO: Если пришлют фото, он не работает
if TEST: if TEST:
bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id)
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
item1 = types.KeyboardButton("🎤Высказаться") item1 = types.KeyboardButton("🎤Высказаться")
item2 = types.KeyboardButton("🎧Послушать") item2 = types.KeyboardButton("🎧Послушать")
markup.add(item1, item2) markup.add(item1, item2)
msg = bot.send_message(chat_id=message.chat.id, text='Я тебя не понимаю🤷‍♀️ запиши голосовое', reply_markup=markup) msg = bot.send_message(chat_id=message.chat.id, text='Я тебя не понимаю🤷‍♀️ запиши голосовое', reply_markup=markup)
bot.register_next_step_handler(msg, standup) bot.register_next_step_handler(msg, standup)
@bot.message_handler(commands=['restart']) @bot.message_handler(commands=['restart'])
def restart_function(message): def restart_function(message):
return standup(message) return standup(message)
@bot.message_handler(commands=['help']) @bot.message_handler(commands=['help'])
def help_function(message): def help_function(message):
msg = bot.send_message(chat_id=message.chat.id, text='Скорее всего ответы на твои вопросы есть здесь, ознакомься: https://telegra.ph/Instrukciya-k-botu-Golosa-Bijsk-10-11-2' msg = bot.send_message(chat_id=message.chat.id, text='Скорее всего ответы на твои вопросы есть здесь, ознакомься: https://telegra.ph/Instrukciya-k-botu-Golosa-Bijsk-10-11-2'
'\nЕсли это не поможет, пиши в тг: @Kerrad1',disable_web_page_preview=not PREVIEW_LINK) '\nЕсли это не поможет, пиши в тг: @Kerrad1',disable_web_page_preview=not PREVIEW_LINK)
bot.register_next_step_handler(msg, standup) bot.register_next_step_handler(msg, standup)
@bot.message_handler(commands=['send']) @bot.message_handler(commands=['send'])
def notify(message): def notify(message):
"""Функция для рассылки сообщений пользователям бота""" """Функция для рассылки сообщений пользователям бота"""
admins = [842766148] admins = [842766148]
command_sender = message.from_user.id command_sender = message.from_user.id
if command_sender in admins: if command_sender in admins:
markup = types.InlineKeyboardMarkup(row_width=1) markup = types.InlineKeyboardMarkup(row_width=1)
button = types.InlineKeyboardButton(text='Я прочитал ', callback_data='from_user') button = types.InlineKeyboardButton(text='Я прочитал ', callback_data='from_user')
success_send_message = 0 success_send_message = 0
error_send_message = 0 error_send_message = 0
markup.add(button) markup.add(button)
user_ids = BotDB.get_all_user_id() user_ids = BotDB.get_all_user_id()
# Парсим список id юзеров для рассылки и рассылаем сообщения # Парсим список id юзеров для рассылки и рассылаем сообщения
for i in user_ids: for i in user_ids:
username = BotDB.get_username(i) username = BotDB.get_username(i)
try: try:
bot.send_message(chat_id=i, bot.send_message(chat_id=i,
text='Привет, на связи админ. Первая тестовая рассылка через этого бота, не суди строго, обещаю не злоупотреблять этим))\n' text='Привет, на связи админ. Первая тестовая рассылка через этого бота, не суди строго, обещаю не злоупотреблять этим))\n'
'Собственно хотел сказать следующее, сегодня ночью обновил бота, добавил ему две функции /restart и /help. ' 'Собственно хотел сказать следующее, сегодня ночью обновил бота, добавил ему две функции /restart и /help. '
'Рекомендую ознакомиться со статьей в /help, там я подробно описал как сейчас все работает. ' 'Рекомендую ознакомиться со статьей в /help, там я подробно описал как сейчас все работает. '
'Если у тебя будут предложения по доработке бота или новому функционал, пиши не стесняйся @Kerrad1. ' 'Если у тебя будут предложения по доработке бота или новому функционал, пиши не стесняйся @Kerrad1. '
'Так же прошу нажать на кнопку под сообщением, чтобы я понял что ты прочитал сообщение❤️\n\nНа этом у меня все, пока, до следующего релиза', reply_markup=markup) 'Так же прошу нажать на кнопку под сообщением, чтобы я понял что ты прочитал сообщение❤️\n\nНа этом у меня все, пока, до следующего релиза', reply_markup=markup)
bot.send_message(chat_id=message.chat.id, bot.send_message(chat_id=message.chat.id,
text=f'Успешно отправлено - @{username}') text=f'Успешно отправлено - @{username}')
success_send_message += 1 success_send_message += 1
except Exception as e: except Exception as e:
bot.send_message(chat_id=message.chat.id, bot.send_message(chat_id=message.chat.id,
text=f'Этому юзеру не отправилось - @{username}') text=f'Этому юзеру не отправилось - @{username}')
error_send_message += 1 error_send_message += 1
bot.send_message(chat_id=message.chat.id, bot.send_message(chat_id=message.chat.id,
text=f'<b>Количество успешных отправок</b> - {success_send_message}', parse_mode='html') text=f'<b>Количество успешных отправок</b> - {success_send_message}', parse_mode='html')
bot.send_message(chat_id=message.chat.id, bot.send_message(chat_id=message.chat.id,
text=f'<b>Количество неуспешных отправок</b> - {error_send_message}', parse_mode='html') text=f'<b>Количество неуспешных отправок</b> - {error_send_message}', parse_mode='html')
standup(message) standup(message)
else: else:
bot.send_message(command_sender, f'у вас нет прав для запуска команды') bot.send_message(command_sender, f'у вас нет прав для запуска команды')
bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id) bot.forward_message(chat_id=GROUP_FOR_LOGS, from_chat_id=message.chat.id, message_id=message.id)
standup(message) standup(message)
@bot.callback_query_handler(func=lambda call: True) @bot.callback_query_handler(func=lambda call: True)
def post_for_group(call): def post_for_group(call):
if call.data == 'from_user' and call.message.content_type == 'text': if call.data == 'from_user' and call.message.content_type == 'text':
try: try:
command_sender = call.message.from_user.id command_sender = call.message.from_user.id
bot.answer_callback_query(call.id, text="Мне приятно, спасибо ❤") bot.answer_callback_query(call.id, text="Мне приятно, спасибо ❤")
#Попробовать варианты если не сработает call.from_user.username #Попробовать варианты если не сработает call.from_user.username
bot.send_message(chat_id=842766148, text=f'Юзер с ником @{call.message.chat.username} по имени {call.message.chat.first_name} прочитал сообщение') bot.send_message(chat_id=842766148, text=f'Юзер с ником @{call.message.chat.username} по имени {call.message.chat.first_name} прочитал сообщение')
except: except:
print('что-то не так') print('что-то не так')
if __name__ == '__main__': if __name__ == '__main__':
telegram_bot() telegram_bot()
try: try:
bot.polling(none_stop=True) bot.polling(none_stop=True)
bot.enable_save_next_step_handlers(delay=2) bot.enable_save_next_step_handlers(delay=2)
bot.load_next_step_handlers() bot.load_next_step_handlers()
except ConnectionError as e: except ConnectionError as e:
if LOGS: if LOGS:
bot.send_message(IMPORTANT_LOGS, "Ошибка соединения, потерял войс бот связь") bot.send_message(IMPORTANT_LOGS, "Ошибка соединения, потерял войс бот связь")
except Exception as r: except Exception as r:
if LOGS: if LOGS:
bot.send_message(IMPORTANT_LOGS, "Произошло что-то непредвиденное, хелп. Войс бот болеет") bot.send_message(IMPORTANT_LOGS, "Произошло что-то непредвиденное, хелп. Войс бот болеет")
finally: finally:
if LOGS: if LOGS:
bot.send_message(IMPORTANT_LOGS, 'Я войс бот упал, помогите') bot.send_message(IMPORTANT_LOGS, 'Я войс бот упал, помогите')