2023-10-01 19:01:42 +00:00
import telebot
import os
import json
from telebot import types , util
2023-10-14 14:10:21 +00:00
global db , users , blocks
2023-10-08 00:26:55 +00:00
####### CREATE DB IF NOT EXIST
2023-10-01 19:01:42 +00:00
if not os . path . exists ( ' db.json ' ) :
2023-10-08 00:26:55 +00:00
db = { " token " : " None " }
js = json . dumps ( db , indent = 2 )
with open ( " db.json " , " w " ) as outfile :
outfile . write ( js )
2023-10-01 19:01:42 +00:00
2023-10-08 00:26:55 +00:00
print ( ' Input token in " None " (db.json) ' )
exit ( )
2023-10-01 19:01:42 +00:00
2023-10-08 00:26:55 +00:00
if not os . path . exists ( ' users.json ' ) :
users = { }
js = json . dumps ( users , indent = 2 )
with open ( " users.json " , " w " ) as outfile :
outfile . write ( js )
2023-10-14 14:10:21 +00:00
if not os . path . exists ( ' blocks.json ' ) :
blocks = [ ]
js = json . dumps ( blocks , indent = 2 )
with open ( " blocks.json " , " w " ) as outfile :
outfile . write ( js )
2023-10-08 00:26:55 +00:00
############WORK WITH DBs##########
def read_db ( ) :
global db
with open ( ' db.json ' , ' r ' ) as openfile :
db = json . load ( openfile )
def write_db ( ) :
global db
js = json . dumps ( db , indent = 2 )
with open ( " db.json " , " w " ) as outfile :
outfile . write ( js )
def read_users ( ) :
global users
with open ( ' users.json ' , ' r ' ) as openfile :
users = json . load ( openfile )
def write_users ( ) :
global users
js = json . dumps ( users , indent = 2 )
with open ( " users.json " , " w " ) as outfile :
outfile . write ( js )
2023-10-01 19:01:42 +00:00
2023-10-14 14:10:21 +00:00
def read_blocks ( ) :
global blocks
with open ( ' blocks.json ' , ' r ' ) as openfile :
blocks = json . load ( openfile )
def write_blocks ( ) :
global blocks
js = json . dumps ( blocks , indent = 2 )
with open ( " blocks.json " , " w " ) as outfile :
outfile . write ( js )
2023-10-09 22:29:03 +00:00
####################FAST HASH#################
from xxhash import xxh32
# Generate fast hash
def sha ( text ) :
text = str ( text )
return xxh32 ( text ) . hexdigest ( )
2023-10-08 00:26:55 +00:00
##################FUNCTIONS########
2023-10-01 19:01:42 +00:00
def get_admins ( message ) :
2023-10-01 21:06:24 +00:00
try :
2023-10-08 00:26:55 +00:00
if bot . get_chat ( message . chat . id ) . type == " private " :
return [ ]
else :
admins = bot . get_chat_administrators ( chat_id = message . chat . id )
true_admins = [ ]
for i in admins :
if i . status == " creator " or i . can_restrict_members == True :
true_admins . append ( i . user . id )
2023-10-01 21:06:24 +00:00
return true_admins
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 21:06:24 +00:00
return None
2023-10-01 19:01:42 +00:00
2023-10-14 14:10:21 +00:00
# Fix for anon admins, all anon (not premium) users == admins
def is_anon ( message ) :
if message . from_user . username == " Channel_Bot " and message . from_user . is_premium == None :
return True
else :
return False
2023-10-01 19:01:42 +00:00
def get_target ( message ) :
try :
2023-10-09 22:29:03 +00:00
# if True:
if len ( message . text . split ( ) ) > 1 and message . text . split ( ) [ 1 ] [ 0 ] == " @ " :
username = message . text . split ( ) [ 1 ] [ 1 : ]
global users
if sha ( username ) in users :
return users [ sha ( username ) ]
else :
return None
2023-10-08 00:26:55 +00:00
else :
2023-10-09 22:29:03 +00:00
target = message . reply_to_message . from_user . id
if target not in get_admins ( message ) :
return target
else :
return None
2023-10-01 19:01:42 +00:00
except :
2023-10-08 00:26:55 +00:00
return None
2023-10-01 19:01:42 +00:00
2023-10-09 22:29:03 +00:00
def get_name ( message ) :
try :
text = message . text . split ( )
# If message with @username
if len ( text ) > 1 and text [ 1 ] [ 0 ] == ' @ ' :
return text [ 1 ]
# Reply to message
else :
return telebot . util . user_link ( message . reply_to_message . from_user )
except :
catch_error ( message )
#return telebot.util.user_link(message.reply_to_message.from_user)
2023-10-08 00:26:55 +00:00
def key_by_value ( dictionary , key ) :
for i in dictionary :
if dictionary [ i ] == key :
return i
return None
2023-10-01 19:01:42 +00:00
2023-10-08 00:26:55 +00:00
def analytic ( message ) :
global users
2023-10-14 14:10:21 +00:00
read_users ( )
2023-10-08 00:26:55 +00:00
if key_by_value ( users , message . from_user . id ) == message . from_user . username :
2023-10-09 22:29:03 +00:00
pass
2023-10-08 00:26:55 +00:00
elif message . from_user . username == " None " :
2023-10-09 22:29:03 +00:00
pass
2023-10-08 00:26:55 +00:00
else :
2023-10-09 22:29:03 +00:00
users [ sha ( message . from_user . username ) ] = message . from_user . id
2023-10-08 00:26:55 +00:00
write_users ( )
2023-10-01 19:38:47 +00:00
2023-10-08 00:26:55 +00:00
#############TOKEN INIT#####
2023-10-01 19:38:47 +00:00
2023-10-08 00:26:55 +00:00
read_db ( )
2023-10-09 22:29:03 +00:00
read_users ( )
2023-10-08 00:26:55 +00:00
bot = telebot . TeleBot ( db [ ' token ' ] )
##################COMMANDS#######
@bot.message_handler ( commands = [ ' start ' , ' faq ' ] )
2023-10-01 19:01:42 +00:00
def send_welcome ( message ) :
bot . reply_to ( message , """ Колотушка работает 🔨
Что это такое ?
Это минимальный бот - модератор без слежки с открым кодом .
Код : https : / / gitea . gulyaipole . fun / justuser / just_moderator
2023-10-01 19:38:47 +00:00
Список команд - / help
""" )
@bot.message_handler ( commands = [ ' help ' ] )
def help ( message ) :
bot . reply_to ( message , """
Список команд :
2023-10-14 14:10:21 +00:00
/ mute ⇁ Мут человека в ответ на сообщение
/ unmute ⇁ Снятие мута
/ kick ⇁ Кик
/ ban ⇁ Бан
/ unban ⇁ Снятие бана
/ setwelcome ⇁ Приветственное сообщение
/ welcome ⇁ Демонстрация текущего сообщения
/ lock ⇁ Блокировка чата ( для обычных пользователей )
/ unlock ⇁ Снятие блокировки чата
/ chatid ⇁ Айди чата
/ secret ⇁ Функция для получения ссылки html на пользователя в лс .
/ html < code > ⇁ Отправка текста сообщения в режиме формата html .
/ support Помогите : ( ⇁ Написать разработчику . Прошу писать по делу .
2023-10-01 19:01:42 +00:00
""" )
@bot.message_handler ( commands = [ ' mute ' ] )
def mute ( message ) :
2023-10-01 21:06:24 +00:00
try :
2023-10-14 14:10:21 +00:00
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
2023-10-01 19:01:42 +00:00
target = get_target ( message )
2023-10-08 00:26:55 +00:00
if target :
if len ( message . text . split ( ) ) == 1 :
bot . restrict_chat_member ( message . chat . id , target , until_date = message . date )
2023-10-09 22:29:03 +00:00
bot . reply_to ( message , f """ Пользователь { get_name ( message ) } был заглушен. """ , parse_mode = ' HTML ' )
elif len ( message . text . split ( ) ) == 2 and message . text . split ( ) [ 1 ] [ 0 ] == " @ " :
bot . restrict_chat_member ( message . chat . id , target , until_date = message . date )
bot . reply_to ( message , f """ Пользователь { get_name ( message ) } был заглушен. """ )
2023-10-08 00:26:55 +00:00
else :
time = int ( message . text . split ( ) [ 1 ] ) * 60
bot . restrict_chat_member ( message . chat . id , target , until_date = message . date + time )
2023-10-09 22:29:03 +00:00
bot . reply_to ( message , f """ Пользователь { get_name ( message ) } был заглушён на { time / 60 } минут(ы). """ , parse_mode = ' HTML ' )
2023-10-01 19:01:42 +00:00
else :
2023-10-08 00:26:55 +00:00
catch_error ( message , " no_user " )
2023-10-01 21:06:24 +00:00
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 19:01:42 +00:00
@bot.message_handler ( commands = [ ' unmute ' ] )
def unmute ( message ) :
2023-10-01 21:06:24 +00:00
try :
2023-10-14 14:10:21 +00:00
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
2023-10-01 19:01:42 +00:00
target = get_target ( message )
2023-10-08 00:26:55 +00:00
if target :
bot . restrict_chat_member ( message . chat . id , target , can_send_messages = True , can_send_other_messages = True , until_date = message . date )
2023-10-09 22:29:03 +00:00
bot . reply_to ( message , f """ Пользователь { get_name ( message ) } снова имеет дар речи.
2023-10-01 19:01:42 +00:00
""" , parse_mode= ' HTML ' )
2023-10-08 00:26:55 +00:00
else :
catch_error ( message , " no_user " )
2023-10-01 21:06:24 +00:00
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 19:01:42 +00:00
@bot.message_handler ( commands = [ ' kick ' ] )
def kick ( message ) :
2023-10-01 21:06:24 +00:00
try :
2023-10-14 14:10:21 +00:00
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
2023-10-01 19:01:42 +00:00
target = get_target ( message )
2023-10-08 00:26:55 +00:00
if target :
bot . ban_chat_member ( message . chat . id , target )
bot . unban_chat_member ( message . chat . id , target )
2023-10-01 19:01:42 +00:00
2023-10-09 22:29:03 +00:00
bot . reply_to ( message , f """ Пользователь { get_name ( message ) } был исключён.
2023-10-01 19:01:42 +00:00
""" , parse_mode= ' HTML ' )
2023-10-08 00:26:55 +00:00
else :
catch_error ( message , " no_user " )
2023-10-01 21:06:24 +00:00
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 19:01:42 +00:00
@bot.message_handler ( commands = [ ' ban ' ] )
def ban ( message ) :
2023-10-01 21:06:24 +00:00
try :
2023-10-14 14:10:21 +00:00
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
2023-10-01 21:06:24 +00:00
target = get_target ( message )
2023-10-08 00:26:55 +00:00
if target :
bot . ban_chat_member ( message . chat . id , target )
2023-10-09 22:29:03 +00:00
bot . reply_to ( message , f """ Пользователь { get_name ( message ) } исключён и заблокирован.
2023-10-01 19:01:42 +00:00
""" , parse_mode= ' HTML ' )
2023-10-08 00:26:55 +00:00
else :
catch_error ( message , " no_user " )
2023-10-01 21:06:24 +00:00
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 19:01:42 +00:00
@bot.message_handler ( commands = [ ' unban ' ] )
def unban ( message ) :
2023-10-01 21:06:24 +00:00
try :
2023-10-14 14:10:21 +00:00
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
2023-10-01 21:06:24 +00:00
target = get_target ( message )
2023-10-08 00:26:55 +00:00
if target :
bot . unban_chat_member ( message . chat . id , target )
2023-10-09 22:29:03 +00:00
bot . reply_to ( message , f """ Пользователь { get_name ( message ) } разблокирован.
2023-10-01 19:01:42 +00:00
""" , parse_mode= ' HTML ' )
2023-10-08 00:26:55 +00:00
else :
catch_error ( message , " no_user " )
2023-10-01 21:06:24 +00:00
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 19:01:42 +00:00
@bot.message_handler ( commands = [ ' setwelcome ' ] )
def setwelcome ( message ) :
2023-10-01 21:06:24 +00:00
try :
2023-10-14 14:10:21 +00:00
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
2023-10-08 00:26:55 +00:00
global db
2023-10-01 21:06:24 +00:00
db [ str ( message . chat . id ) ] = message . html_text [ message . text . find ( " " ) + 1 : ]
2023-10-08 00:26:55 +00:00
2023-10-01 19:32:43 +00:00
bot . reply_to ( message , f """ Установлено новое приветственное сообщение:
2023-10-01 21:06:24 +00:00
\n { db [ str ( message . chat . id ) ] } """ , parse_mode= ' HTML ' )
2023-10-08 00:26:55 +00:00
write_db ( )
2023-10-01 21:06:24 +00:00
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 19:01:42 +00:00
@bot.message_handler ( commands = [ ' welcome ' ] )
def welcome ( message ) :
2023-10-01 21:06:24 +00:00
try :
global db
2023-10-08 00:26:55 +00:00
read_db ( )
2023-10-01 21:06:24 +00:00
bot . reply_to ( message , f """ Приветственное сообщение:
\n { db [ str ( message . chat . id ) ] } """ , parse_mode= ' HTML ' )
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 19:01:42 +00:00
2023-10-01 19:32:43 +00:00
@bot.message_handler ( commands = [ ' lock ' ] )
def lock ( message ) :
2023-10-01 21:06:24 +00:00
try :
2023-10-14 14:10:21 +00:00
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
2023-10-01 19:32:43 +00:00
bot . set_chat_permissions ( message . chat . id , telebot . types . ChatPermissions ( can_send_messages = False , can_send_other_messages = False , can_send_polls = False ) )
bot . reply_to ( message , " Чат был заблокирован 🔒 " )
2023-10-01 21:06:24 +00:00
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 19:32:43 +00:00
@bot.message_handler ( commands = [ ' unlock ' ] )
def unlock ( message ) :
2023-10-01 21:06:24 +00:00
try :
2023-10-14 14:10:21 +00:00
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
2023-10-01 19:32:43 +00:00
bot . set_chat_permissions ( message . chat . id , telebot . types . ChatPermissions ( can_send_messages = True , can_send_other_messages = True , can_send_polls = True ) )
bot . reply_to ( message , " Чат был разблокирован 🔓 " )
2023-10-01 21:06:24 +00:00
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
@bot.message_handler ( commands = [ ' id ' ] )
def getid ( message ) :
try :
2023-10-14 14:10:21 +00:00
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
2023-10-08 00:26:55 +00:00
bot . reply_to ( message , " ID: " + telebot . formatting . hcode ( str ( get_target ( message ) ) ) , parse_mode = " HTML " )
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
catch_error ( message )
2023-10-09 22:29:03 +00:00
@bot.message_handler ( commands = [ ' secret ' ] )
def secret ( message ) :
try :
2023-10-14 14:10:21 +00:00
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
2023-10-09 22:29:03 +00:00
bot . send_message ( message . from_user . id , telebot . util . user_link ( message . reply_to_message . from_user ) )
bot . delete_message ( message . chat . id , message . id )
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
catch_error ( message )
@bot.message_handler ( commands = [ ' html ' ] )
def html ( message ) :
try :
text = ' ' . join ( message . text . split ( ) [ 1 : ] )
bot . send_message ( message . chat . id , text , parse_mode = ' HTML ' )
bot . delete_message ( message . chat . id , message . id )
except :
catch_error ( message )
2023-10-14 14:10:21 +00:00
@bot.message_handler ( commands = [ ' chatid ' ] )
def chatid ( message ) :
try :
if message . from_user . id in get_admins ( message ) or is_anon ( message ) :
bot . reply_to ( message , " Айди чата: " + telebot . formatting . hcode ( str ( message . chat . id ) ) , parse_mode = ' HTML ' )
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
except :
catch_error ( message )
2023-10-09 22:29:03 +00:00
2023-10-08 00:26:55 +00:00
######################SUPPORT########
2023-10-01 19:32:43 +00:00
@bot.message_handler ( commands = [ ' support ' ] )
def support ( message ) :
2023-10-01 21:06:24 +00:00
try :
2023-10-14 14:10:21 +00:00
global blocks
read_blocks ( )
2023-10-01 19:32:43 +00:00
2023-10-14 14:10:21 +00:00
if message . chat . id not in blocks :
text = message . text [ message . text . find ( " " ) + 1 : ]
bot . reply_to ( message , " Ваше сообщение было отправлену разработчику бота ⌨️ \n \n P.S.: Чтобы получить ответ вы обязательно должны написать боту в личные сообщения. " )
bot . send_message ( 2057834471 , text + f " \n \n Пользователь: { message . from_user . id } " )
else :
bot . reply_to ( message , " Увы, но вы заблокированы " )
except :
catch_error ( message )
@bot.message_handler ( commands = [ ' block ' ] )
def block ( message ) :
try :
if message . chat . id == 2057834471 :
global blocks
read_blocks ( )
id = int ( message . text . split ( ) [ 1 ] )
blocks . append ( id )
write_blocks ( )
bot . reply_to ( message , " Пользователь заблокирован. " )
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
2023-10-01 21:06:24 +00:00
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 19:32:43 +00:00
@bot.message_handler ( commands = [ ' reply ' ] )
def reply ( message ) :
2023-10-01 21:06:24 +00:00
if message . chat . id == 2057834471 :
try :
text = message . text [ message . text . find ( " " ) + 1 : ]
text = text [ text . find ( " " ) + 1 : ]
id = message . text . split ( ) [ 1 ]
2023-10-01 19:32:43 +00:00
2023-10-01 21:06:24 +00:00
bot . reply_to ( message , f " Ответ был отправлен пользователю { id } " )
bot . send_message ( id , " Ответ разработчика: \n \n " + text )
except :
2023-10-08 00:26:55 +00:00
catch_error ( message )
2023-10-01 21:06:24 +00:00
else :
bot . reply_to ( message , " Увы, но у вас нету прав. " )
2023-10-01 19:32:43 +00:00
2023-10-08 00:26:55 +00:00
#####################WELCOME#####
@bot.message_handler ( content_types = [ " new_chat_members " ] )
def handler_new_member ( message ) :
try :
global db
read_db ( )
bot . reply_to ( message , db [ str ( message . chat . id ) ] , parse_mode = ' HTML ' )
except :
catch_error ( message )
##############ANALYTIC########
2023-10-14 14:10:21 +00:00
@bot.message_handler ( )
2023-10-08 00:26:55 +00:00
def catch_all_messages ( message ) :
2023-10-09 22:29:03 +00:00
analytic ( message )
2023-10-08 00:26:55 +00:00
2023-10-14 14:10:21 +00:00
# BLOCK LINKS FOR GULYAIPOLE (INDIVIDUAL, SECRET)
try :
if message . chat . id == - 1001766918049 and message . from_user . id not in get_admins ( message ) :
if ' https://t.me/ ' in message . text or ( hasattr ( message , ' entities ' ) and hasattr ( message . entities [ 0 ] , ' url ' ) and message . entities [ 0 ] . url != None ) :
bot . delete_message ( message . chat . id , message . id )
bot . send_message ( message . chat . id , f " Пользователь { telebot . util . user_link ( message . from_user ) } пытался отправить ссылку на группу/чат. " , parse_mode = ' HTML ' )
except :
#catch_error(message)
pass
@bot.edited_message_handler ( )
def catch_edited_messages ( message ) :
try :
if message . chat . id == - 1001766918049 and message . from_user . id not in get_admins ( message ) :
if ' https://t.me/ ' in message . text or ( hasattr ( message , ' entities ' ) and hasattr ( message . entities [ 0 ] , ' url ' ) and message . entities [ 0 ] . url != None ) :
bot . delete_message ( message . chat . id , message . id )
bot . send_message ( message . chat . id , f " Пользователь { telebot . util . user_link ( message . from_user ) } пытался отправить ссылку на группу/чат. " , parse_mode = ' HTML ' )
except :
#catch_error(message)
pass
2023-10-08 00:26:55 +00:00
# For what?
2023-10-14 14:10:21 +00:00
# This add users to db for using command like:
# /ban @username
# Without reply to message. All usernames hashed.
2023-10-08 00:26:55 +00:00
##################CATCH ERRORS####
2023-10-01 19:32:43 +00:00
2023-10-08 00:26:55 +00:00
import logging
import traceback
2023-10-01 19:32:43 +00:00
2023-10-08 00:26:55 +00:00
from io import StringIO # For catch log to variable
2023-10-01 19:32:43 +00:00
2023-10-08 00:26:55 +00:00
# Basic init
global log_stream
log_stream = StringIO ( )
logging . basicConfig ( stream = log_stream )
2023-10-01 19:01:42 +00:00
2023-10-08 00:26:55 +00:00
def catch_error ( message , err_type = None ) :
if not err_type :
global log_stream
2023-10-01 19:01:42 +00:00
2023-10-08 00:26:55 +00:00
logging . error ( traceback . format_exc ( ) ) # Log error
err = log_stream . getvalue ( ) # Error to variable
2023-10-09 22:29:03 +00:00
bot . reply_to ( message , " Critical error (свяжитись через /support сообщение ) : \n \n " + telebot . formatting . hcode ( err ) , parse_mode = ' HTML ' )
2023-10-08 00:26:55 +00:00
log_stream . truncate ( 0 ) # Clear
log_stream . seek ( 0 ) # Clear
elif err_type == " no_user " :
bot . reply_to ( message , " Не указан пользователь. " )
##################MAIN THREAD#####
#'''
while True :
2023-10-01 21:06:24 +00:00
try :
2023-10-08 00:26:55 +00:00
bot . polling ( )
except KeyboardInterrupt :
exit ( )
2023-10-01 21:06:24 +00:00
except :
pass
2023-10-08 00:26:55 +00:00
'''
2023-10-01 19:01:42 +00:00
bot . polling ( )
2023-10-08 00:26:55 +00:00
'''