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.

318 lines
9.5 KiB

1 year ago
import telebot
import os
import json
global db
########### CREATE DB IF NOT EXIST
if not os.path.exists('db.json'):
db = {"token": "None"}
js = json.dumps(db, indent=2)
with open("db.json", "w") as outfile:
outfile.write(js)
print('Input token in "None" (db.json)')
exit()
# db = {
# "Anon": {"id": 2045634, channel: "AnotherUser", blocks: [5375652, 436432], avatar: "♿️", pkey: "fuD2d", keys: {AnotherUser: "dDH73s"}},
1 year ago
# 2045634: "Anon"
#}
# Невозможно хешировать айди - это всё ломает
#
# Первая строка - информация о пользователе (айди, канал, блокнутые пользователи)
# Вторая строчка - для отправки сообщения и блокировки
# keys - ключи , pkey - личный ключ
1 year ago
############WORK WITH DBs##########
from db import *
db = read_db()
###### WORK WITH HASHES ##########
from hash import hash
from random import randint
1 year ago
################ TOKEN INIT ######
bot = telebot.TeleBot(db['token'])
##################CATCH ERRORS####
import logging
import traceback
from io import StringIO # For catch log to variable
# Basic init
global log_stream
log_stream = StringIO()
logging.basicConfig(stream=log_stream)
def catch_error(message, err_type = None):
try:
if not err_type:
global log_stream
logging.error(traceback.format_exc()) # Log error
err = log_stream.getvalue() # Error to variable
bot.reply_to(message, "Critical error:\n\n" + telebot.formatting.hcode(err), parse_mode='HTML')
log_stream.truncate(0) # Clear
log_stream.seek(0) # Clear
except:
pass
def is_auth(message):
try:
db = read_db()
if str(message.chat.id) in db:
return True
else:
bot.reply_to(message,"Извините, но Вы не авторизованы.")
return False
except:
catch_error(message)
1 year ago
############## MAIN
@bot.message_handler(commands=['start'])
def start(message):
bot.reply_to(message, f"""Приветствую, это бот для анонимного общения.
Главное - выполняет свою функцию без рекламы, без платы и без слежки.
1 year ago
Для начала зарегистрируйся:
/reg ЛюбойНикнейм
11 months ago
Установка адресата - { telebot.formatting.hcode(":НикАдресата") }
1 year ago
Исходный код: https://gitea.gulyaipole.fun/justuser/just_anonchat
Связь с админом: { telebot.formatting.hcode(":justuser") }
1 year ago
Ещё проекты: @just_openbots""", parse_mode="HTML")
@bot.message_handler(commands=['reg'])
def reg(message):
try:
db = read_db()
if len(message.text.split()) == 2:
nick = message.text.split()[1]
if nick in db:
bot.reply_to(message, "Данный пользователь уже зарегистрирован.")
elif str(message.chat.id) in db:
bot.reply_to(message, "Вы уже зарегистрированы.")
else:
db[nick] = {"id": message.chat.id, "channel": None, "blocks": [], "avatar": "♿️", "pkey": hash(randint(74287, 5747962)), "keys": {}}
db[message.chat.id] = nick
write_db(db)
bot.reply_to(message, "Вы зарегистрировались!\nПриятного использования.")
1 year ago
else:
bot.reply_to(message, "Вы ввели не 2 аргумента, нужно: /reg ЛюбойНикнейм")
except:
catch_error(message)
@bot.message_handler(commands=['b'])
def b(message):
try:
if is_auth(message):
db = read_db()
nick = db[str(message.chat.id)]
block = message.text.split()[1]
# Block by ":user"
if block[0] == ":":
block = block[1:]
if block in db:
if db[block]["id"] not in db[nick]["blocks"]:
db[nick]["blocks"].append(db[block]["id"])
write_db(db)
bot.reply_to(message, f"Пользователь {telebot.formatting.hcode(block)} был заблокирован.",parse_mode="HTML")
else:
bot.reply_to(message, "Данного пользователя не существует.")
except:
catch_error(message)
@bot.message_handler(commands=['u'])
def u(message):
try:
if is_auth(message):
db = read_db()
nick = db[str(message.chat.id)]
block = message.text.split()[1]
# Unblock by ":user"
if block[0] == ":":
block = block[1:]
if db[block]["id"] in db[nick]["blocks"]:
db[nick]["blocks"].remove(db[block]["id"])
write_db(db)
bot.reply_to(message, f"Была снята блокировка с пользователя {telebot.formatting.hcode(block)}",parse_mode="HTML")
except:
catch_error(message)
@bot.message_handler(commands=['nick'])
def nick(message):
try:
if is_auth(message):
db = read_db()
new_nick = message.text.split()[1]
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]
write_db(db)
bot.reply_to(message,f"Вы успешно сменили ник с {telebot.formatting.hcode(old_nick)} на {telebot.formatting.hcode(new_nick)}",parse_mode="HTML")
bot.reply_to(message, "Ваша аватарка сброшена до стандартной: ♿️")
else:
bot.reply_to(message,"Данный ник уже занят")
except:
catch_error(message)
@bot.message_handler(commands=['av'])
def av(message):
try:
if is_auth(message):
db = read_db()
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
write_db(db)
bot.reply_to(message,"Новая аватарка успешно установлена")
except:
catch_error(message)
############# WORK WITH KEY ########
@bot.message_handler(commands=['key'])
def key(message):
if len(message.text.split()) == 2:
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")
else:
bot.reply_to(message,"/key ник")
@bot.message_handler(commands=['ver'])
def ver(message):
if len(message.text.split()) == 3:
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,"❌ Ключи не совпадают")
else:
bot.reply_to(message,"/ver ник ключ")
####################################
@bot.message_handler(commands=['me'])
def me(message):
try:
db = read_db()
nick = db[str(message.chat.id)]
channel = db[nick]["channel"]
avatar = db[nick]["avatar"]
pkey = db[nick]["pkey"]
if not channel:
channel = "Не задан."
bot.reply_to(message, f"""Заданный канал: {telebot.formatting.hcode(channel)}
Ваш ник: {telebot.formatting.hcode(nick)}
Ваша аватарка: {telebot.formatting.hcode(avatar)}
Ваш публичный ключ: {telebot.formatting.hcode(pkey)}""",parse_mode="HTML")
except:
catch_error(message)
1 year ago
11 months ago
@bot.message_handler(func=lambda message: True, content_types=['photo','text'])
1 year ago
def catch_all_messages(message):
try:
db = read_db()
nick = db[str(message.chat.id)]
avatar = ' ' + db[nick]["avatar"]
11 months ago
if message.content_type == "text" and message.text[:1].lower() == ":":
channel = message.text[1:]
if channel in db:
db[nick]["channel"] = channel
# Обрабатываем публичные ключи
if channel in db[nick]["keys"]:
pass
else:
db[nick]["keys"][channel] = db[channel]["pkey"]
bot.reply_to(message, "Установлен адресат: " + telebot.formatting.hcode(channel), parse_mode="HTML")
write_db(db)
else:
bot.reply_to(message, "Не существует данного пользователя.")
elif db[nick]["channel"] != None:
channel = db[nick]["channel"]
if message.chat.id not in db[channel]["blocks"]:
try:
11 months ago
# 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")
11 months ago
else:
bot.send_message(db[channel]["id"], f"{telebot.formatting.hcode(':'+nick) + avatar}\n" + message.text, parse_mode="HTML")
11 months ago
except:
bot.reply_to(message, "Сообщение не было доставлено.\nВероятно пользователь заблокировал бота.")
else:
bot.reply_to(message, "Увы, но вас заблокировал данный пользователь.")
1 year ago
else:
11 months ago
bot.reply_to(message, f"У вас не указан чат.\nЧтобы подключится к чату напишите: {telebot.formatting.hcode(':Никнейм')} ", parse_mode="HTML")
except:
catch_error(message)
1 year ago
#### POLLING ####
mode = 0
# Normal - 0, debug - 1
if mode == 0:
while True:
try:
bot.polling()
except KeyboardInterrupt:
exit()
except:
pass
elif mode == 1:
bot.polling()