You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

347 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import telebot
import os
import json
from icecream import ic
########### Функции ##############
from func import *
########### Работа с БД ##########
from db import *
raw_db = read_db()
###### Класс пользователя ########
from user import *
# user.id = 123
# user.pkey = "fd35s"
# user.channel = "anotheruser"
# user.avatar = "♿️"
# user.blocks = [124235]
# user.keys = {"anotheruser": "re543"}
####### Работа с хэшем ###########
from hash import hash
from random import randint
##### Инициализация токена #######
bot = telebot.TeleBot(raw_db['token'])
########## Ловим ошибки ##########
from catch_err import *
############## MAIN ##############
@bot.message_handler(commands=['start', 'help'])
def start(message):
bot.reply_to(message, f"""Приветствую, это бот для анонимного общения.
Главное - выполняет свою функцию без рекламы, без платы и без слежки.
Для начала зарегистрируйся:
/reg ЛюбойНикнейм
Установка адресата - { telebot.formatting.hcode(":НикАдресата") }
Исходный код: https://gitea.404.mn/justuser/just_anonchat
Связь с админом: { telebot.formatting.hcode(":justuser") }
Ещё проекты: @just_openbots""", parse_mode="HTML")
@bot.message_handler(commands=['reg'])
def reg(message):
try:
db = load()
if not ok_args(bot, message, 2, '```\n/reg никнейм```'):
return 0
nick = message.text.split()[1]
# Проверка ника
if not nick_ok(bot, message, nick):
return 0
if nick in db:
bot.reply_to(message, "Данный пользователь уже зарегистрирован.")
elif str(message.chat.id) in db:
bot.reply_to(message, "Вы уже зарегистрированы.")
else:
user = user_(message.chat.id, hash(randint(74287, 5747962)))
db[nick] = user
db[message.chat.id] = nick
save(db)
bot.reply_to(message, "Вы зарегистрировались!\nПриятного использования.")
except:
catch_error(bot, message)
@bot.message_handler(commands=['b'])
def b(message):
try:
if not is_auth(bot, message) or not ok_args(bot, message, 2, '```\n/b :ник``` или ```\n/b ник```'):
return 0
db = load()
nick = db[str(message.chat.id)]
user = db[nick]
block = message.text.split()[1]
# Block by ":user"
if block[0] == ":":
block = block[1:]
if block in db:
if db[block].id not in user.blocks:
user.blocks.append(db[block].id)
save(db)
bot.reply_to(message, f"Пользователь {telebot.formatting.hcode(block)} был заблокирован.",parse_mode="HTML")
else:
bot.reply_to(message, "Данного пользователя не существует.")
except:
catch_error(bot, message)
@bot.message_handler(commands=['u'])
def u(message):
try:
if not is_auth(bot, message) or not ok_args(bot, message, 2, '```\n/u :ник``` или ```\n/u ник```'):
return 0
db = load()
nick = db[str(message.chat.id)]
user = db[nick]
block = message.text.split()[1]
# Unblock by ":user"
if block[0] == ":":
block = block[1:]
if block in db and db[block].id in user.blocks:
user.blocks.remove(db[block].id)
save(db)
bot.reply_to(message, f"Была снята блокировка с пользователя {telebot.formatting.hcode(block)}",parse_mode="HTML")
else:
bot.reply_to(message, "Данного пользователя не существует.")
except:
catch_error(bot, message)
@bot.message_handler(commands=['nick'])
def nick(message):
try:
if not is_auth(bot, message) or not ok_args(bot, message, 2, '```\n/nick ник```'):
return 0
db = load()
new_nick = message.text.split()[1]
# Проверка ника
if not nick_ok(bot, message, new_nick):
return 0
old_nick = db[str(message.chat.id)]
if new_nick not in db:
db[new_nick] = db[old_nick]
db[new_nick].avatar = "♿️"
db[str(message.chat.id)] = new_nick
del db[old_nick]
save(db)
bot.reply_to(message,f"Вы успешно сменили ник с {telebot.formatting.hcode(old_nick)} на {telebot.formatting.hcode(new_nick)}",parse_mode="HTML")
bot.reply_to(message, """Ваша аватарка сброшена до стандартной: ♿️
Также вы можете сбросить публичный ключ: /key_res""")
else:
bot.reply_to(message,"Данный ник уже занят")
except:
catch_error(bot, message)
@bot.message_handler(commands=['av'])
def av(message):
try:
if not is_auth(bot, message) or not ok_args(bot, message, 2, '```\n/av ❄️```'):
return 0
db = load()
if not len(message.text.split()) > 1:
bot.reply_to(message,"Укажите аватарку")
return 0
new_avatar = message.text.split()[1]
if len(new_avatar) > 10:
bot.reply_to(message,"Слишком большое количество символов для аватарки")
else:
nick = db[str(message.chat.id)]
db[nick].avatar = new_avatar
save(db)
bot.reply_to(message,"Новая аватарка успешно установлена")
except:
catch_error(bot, message)
######### Работа с ключом ########
@bot.message_handler(commands=['key'])
def key(message):
try:
if not is_auth(bot, message) or not ok_args(bot, message, 2, '```\n/key ник``` или ```\n/key :ник```'):
return 0
db = load()
nick = message.text.split()[1]
if nick[0] == ':':
nick = nick[1:]
key = db[nick].pkey
bot.reply_to(message,f"Ключ пользователя: {telebot.formatting.hcode(key)}", parse_mode="HTML")
except:
catch_error(bot, message)
@bot.message_handler(commands=['ver'])
def ver(message):
try:
if not is_auth(bot, message) or not ok_args(bot, message, 3, '```\n/ver ник ключ``` или ```\n/ver :ник ключ```'):
return 0
db = load()
nick = message.text.split()[1]
if nick[0] == ':':
nick = nick[1:]
key = message.text.split()[2]
if not nick in db:
bot.reply_to(message,"Не существует такого пользователя")
return 0
if key == db[nick].pkey:
bot.reply_to(message,"✅ Ключи совпадают")
else:
bot.reply_to(message,"❌ Ключи не совпадают")
except:
catch_error(bot, message)
@bot.message_handler(commands=['key_res'])
def key_res(message):
try:
if not is_auth(bot, message) or not ok_args(bot, message, 1, '```\n/key_res```'):
return 0
db = load()
key = hash(randint(74287, 5747962))
nick = db[str(message.chat.id)]
old_key = db[nick].pkey
db[nick].pkey = key
save(db)
bot.reply_to(message,f"""🔑 Ключ успешно сброшен.
Старый ключ: {telebot.formatting.hcode(old_key)}
Новый ключ: {telebot.formatting.hcode(key)}""",parse_mode="HTML")
except:
catch_error(bot, message)
##################################
@bot.message_handler(commands=['me'])
def me(message):
try:
if not is_auth(bot, message) or not ok_args(bot, message, 1, '```\n/me```'):
return 0
db = load()
nick = db[str(message.chat.id)]
user = db[nick]
ch = user.channel
if not user.channel:
ch = "Не задан."
bot.reply_to(message, f"""Заданный канал: {telebot.formatting.hcode(ch)}
Ваш ник: {telebot.formatting.hcode(nick)}
Ваша аватарка: {telebot.formatting.hcode(user.avatar)}
Ваш публичный ключ: {telebot.formatting.hcode(user.pkey)}""",parse_mode="HTML")
except:
catch_error(bot, message)
###### Передача сообщений ########
@bot.message_handler(func=lambda message: True, content_types=['photo','text', 'document', 'voice', 'video'])
def catch_all_messages(message):
try:
db = load()
# Авторизован ли
if not is_auth(bot, message):
return 0
nick = db[str(message.chat.id)]
user = db[nick]
avatar = ' ' + user.avatar
if message.content_type == "text" and message.text[:1].lower() == ":":
channel = message.text[1:]
if channel in db:
# Проверяем ключи
if not key_valid(bot, message, channel):
return 0
user.channel = channel
bot.reply_to(message, "Установлен адресат: " + telebot.formatting.hcode(channel), parse_mode="HTML")
save(db)
else:
bot.reply_to(message, "Не существует данного пользователя.")
elif user.channel != None:
channel = user.channel
db = load()
# Проверяем существование адресата
if channel not in db:
bot.reply_to(message, "Не существует данного пользователя.")
return 0
# Проверяем ключи
if not key_valid(bot, message, channel):
return 0
if message.chat.id not in db[channel].blocks:
try:
# Check if image
if "photo" in message.json:
img_id = message.json['photo'][0]['file_id']
# Catch caption
if "caption" in message.json:
caption = "\n" + message.json['caption']
else:
caption = ""
bot.send_photo(db[channel].id, img_id, f"{telebot.formatting.hcode(':'+nick) + avatar}" + caption, parse_mode="HTML")
elif "document" in message.json:
doc_id = message.json['document']['file_id']
if "caption" in message.json:
caption = "\n" + message.json['caption']
else:
caption = ""
bot.send_document(db[channel].id, doc_id, caption = f"{telebot.formatting.hcode(':'+nick) + avatar}" + caption, parse_mode="HTML")
elif "voice" in message.json:
voice_id = message.json['voice']['file_id']
bot.send_document(db[channel].id, voice_id, caption = f"{telebot.formatting.hcode(':'+nick) + avatar}", parse_mode="HTML")
elif "video" in message.json:
vid_id = message.json['video']['file_id']
if "caption" in message.json:
caption = "\n" + message.json['caption']
else:
caption = ""
bot.send_video(db[channel].id, vid_id, caption = f"{telebot.formatting.hcode(':'+nick) + avatar}", parse_mode="HTML")
else:
try:
bot.send_message(db[channel].id, f"{telebot.formatting.hcode(':'+nick) + avatar}\n" + message.text, parse_mode="HTML")
except:
catch_error(bot, message, 'spec_symb')
except:
catch_error(bot, message)
bot.reply_to(message, "Сообщение не было доставлено.\nВероятно пользователь заблокировал бота.")
else:
bot.reply_to(message, "Увы, но вас заблокировал данный пользователь.")
else:
bot.reply_to(message, f"У вас не указан чат.\nЧтобы подключится к чату напишите: {telebot.formatting.hcode(':Никнейм')} ", parse_mode="HTML")
except:
catch_error(bot, message)
#### POLLING ####
from sys import argv
if len(argv) > 1:
mode = "debug"
else:
mode = "normal"
if mode == "normal":
while True:
try:
bot.polling()
except KeyboardInterrupt:
exit()
except:
pass
elif mode == "debug":
ic("Started debug...")
bot.polling()