Add filter available_roles
This commit is contained in:
parent
f6e2653daf
commit
c9954c64ff
|
@ -4,7 +4,7 @@ api_id = ""
|
||||||
api_hash = ""
|
api_hash = ""
|
||||||
|
|
||||||
group_id = ""
|
group_id = ""
|
||||||
log_group_id = ""
|
second_group_id = ""
|
||||||
|
|
||||||
vt_api = ""
|
vt_api = ""
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ Logging admin command actions in database.
|
||||||
| `db_url` | Connection info to database |
|
| `db_url` | Connection info to database |
|
||||||
| `api_id` and `api_hash` | Telegram application data |
|
| `api_id` and `api_hash` | Telegram application data |
|
||||||
| `group_id` | Group id |
|
| `group_id` | Group id |
|
||||||
| `telegram_log_chat` | Seconds group for admins |
|
| `second_group_id` | Seconds group for admins |
|
||||||
| `vt_api` | VirusTotalAPI token (optionaly) |
|
| `vt_api` | VirusTotalAPI token (optionaly) |
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
6
app.py
6
app.py
|
@ -4,10 +4,16 @@ from aiogram import executor
|
||||||
from database import models
|
from database import models
|
||||||
|
|
||||||
from load import dp, bot
|
from load import dp, bot
|
||||||
|
import filters
|
||||||
|
|
||||||
|
dp.filters_factory.bind(filters.AvaibleRolesFilter)
|
||||||
|
dp.filters_factory.bind(filters.ReplayMessageFilter)
|
||||||
|
|
||||||
import handlers
|
import handlers
|
||||||
import config
|
import config
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
|
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
|
||||||
|
|
||||||
WEBAPP_HOST = '127.0.0.1'
|
WEBAPP_HOST = '127.0.0.1'
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import json
|
|
||||||
|
|
||||||
from aiogram import Dispatcher,Bot
|
from aiogram import Dispatcher,Bot
|
||||||
from environs import Env
|
from environs import Env
|
||||||
|
|
||||||
|
@ -12,7 +10,7 @@ use_webhook = True
|
||||||
token = env.str("bot_token")
|
token = env.str("bot_token")
|
||||||
|
|
||||||
group_id = env.str("group_id")
|
group_id = env.str("group_id")
|
||||||
telegram_log_chat_id = env.str("log_group_id")
|
second_group_id = env.str("second_group_id")
|
||||||
|
|
||||||
# Telegram Application
|
# Telegram Application
|
||||||
api_id = env.int("api_id")
|
api_id = env.int("api_id")
|
||||||
|
@ -21,8 +19,16 @@ api_hash = env.str("api_hash")
|
||||||
# Virus Total API
|
# Virus Total API
|
||||||
vt_api = env.str("vt_api")
|
vt_api = env.str("vt_api")
|
||||||
|
|
||||||
with open("config/roles.json","r") as jsonfile:
|
group_permissions = {
|
||||||
roles = json.load(jsonfile)
|
"can_send_messages":True,
|
||||||
|
"can_send_media_messages":False,
|
||||||
|
"can_send_other_messages":True,
|
||||||
|
"can_send_polls":False,
|
||||||
|
"can_invite_users":False,
|
||||||
|
"can_change_info":False,
|
||||||
|
"can_add_web_page_previews":False,
|
||||||
|
"can_pin_messages":False
|
||||||
|
}
|
||||||
|
|
||||||
db_url = env.str("db_url")
|
db_url = env.str("db_url")
|
||||||
|
|
||||||
|
|
|
@ -1,72 +0,0 @@
|
||||||
{
|
|
||||||
"level": {
|
|
||||||
"owner": 3,
|
|
||||||
"admin": 2,
|
|
||||||
"helper": 1,
|
|
||||||
"member": 0
|
|
||||||
},
|
|
||||||
"group_permissions": {
|
|
||||||
"can_send_messages": true,
|
|
||||||
"can_send_media_messages": true,
|
|
||||||
"can_send_other_messages": true,
|
|
||||||
"can_send_polls": false,
|
|
||||||
"can_invite_users": false,
|
|
||||||
"can_change_info": false,
|
|
||||||
"can_add_web_page_previews": false,
|
|
||||||
"can_pin_messages": false
|
|
||||||
},
|
|
||||||
"roles": {
|
|
||||||
"owner": {
|
|
||||||
"ban": true,
|
|
||||||
"kick": true,
|
|
||||||
"mute": true,
|
|
||||||
"umute": true,
|
|
||||||
"warn": true,
|
|
||||||
"pin": true,
|
|
||||||
"srole": true,
|
|
||||||
"media": true,
|
|
||||||
"stickers": true,
|
|
||||||
"ro": true,
|
|
||||||
"reload": true
|
|
||||||
},
|
|
||||||
"admin": {
|
|
||||||
"ban": true,
|
|
||||||
"kick": true,
|
|
||||||
"mute": true,
|
|
||||||
"umute": true,
|
|
||||||
"warn": true,
|
|
||||||
"pin": true,
|
|
||||||
"srole": true,
|
|
||||||
"media": true,
|
|
||||||
"stickers": true,
|
|
||||||
"ro": true,
|
|
||||||
"reload": true
|
|
||||||
},
|
|
||||||
"helper": {
|
|
||||||
"ban": false,
|
|
||||||
"kick": true,
|
|
||||||
"mute": false,
|
|
||||||
"umute": false,
|
|
||||||
"warn": true,
|
|
||||||
"pin": false,
|
|
||||||
"srole": false,
|
|
||||||
"media": true,
|
|
||||||
"stickers": true,
|
|
||||||
"ro": false,
|
|
||||||
"reload": true
|
|
||||||
},
|
|
||||||
"member": {
|
|
||||||
"ban": false,
|
|
||||||
"kick": false,
|
|
||||||
"mute": false,
|
|
||||||
"umute": false,
|
|
||||||
"warn": false,
|
|
||||||
"pin": false,
|
|
||||||
"srole": false,
|
|
||||||
"media": false,
|
|
||||||
"stickers": false,
|
|
||||||
"ro": false,
|
|
||||||
"reload": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -86,7 +86,7 @@ class Database:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
for i in range(len(newvalues)):
|
for i in range(len(newvalues)):
|
||||||
query = Member.update({fieldnames[i]:newvalues[i]}).where(Member.user_id == user_id)
|
query = Member.update({fieldnames[i]:newvalues[i]}).where(Member.user_id == user_id).execute()
|
||||||
if (query is None):
|
if (query is None):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,14 @@ from playhouse.db_url import connect
|
||||||
|
|
||||||
from datetime import datetime, date
|
from datetime import datetime, date
|
||||||
|
|
||||||
|
from enum import Enum
|
||||||
|
class MemberRoles(Enum):
|
||||||
|
OWNER = "owner"
|
||||||
|
ADMIN = "admin"
|
||||||
|
HELPER = "helper"
|
||||||
|
MEMBER = "member"
|
||||||
|
|
||||||
|
|
||||||
db = connect(config.db_url)
|
db = connect(config.db_url)
|
||||||
|
|
||||||
class Member(Model):
|
class Member(Model):
|
||||||
|
@ -22,7 +30,6 @@ class Member(Model):
|
||||||
database = db
|
database = db
|
||||||
|
|
||||||
class Restriction(Model):
|
class Restriction(Model):
|
||||||
restriction_id = BigIntegerField()
|
|
||||||
operation = CharField()
|
operation = CharField()
|
||||||
|
|
||||||
from_admin = ForeignKeyField(Member,lazy_load=False)
|
from_admin = ForeignKeyField(Member,lazy_load=False)
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
from .filters import IsAdminFilter,ReplayMessageFilter,UserHasRights
|
from .avaible_roles import AvaibleRolesFilter
|
||||||
|
from .replay_message import ReplayMessageFilter
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
from aiogram import types
|
||||||
|
from aiogram.dispatcher.filters import BoundFilter
|
||||||
|
|
||||||
|
from database.database import Member
|
||||||
|
from database.models import MemberRoles
|
||||||
|
|
||||||
|
from load import database
|
||||||
|
|
||||||
|
class AvaibleRolesFilter(BoundFilter):
|
||||||
|
"""Filter accessed roles"""
|
||||||
|
|
||||||
|
key = "available_roles"
|
||||||
|
|
||||||
|
def __init__(self,available_roles:list[MemberRoles]):
|
||||||
|
self.avaible_roles = available_roles
|
||||||
|
|
||||||
|
async def check(self,message:types.Message):
|
||||||
|
member = database.search_single_member(Member.user_id,message.from_user.id)
|
||||||
|
|
||||||
|
if (member.role == "owner"):
|
||||||
|
return True
|
||||||
|
|
||||||
|
status = member.role in [role.value for role in self.avaible_roles]
|
||||||
|
if (not status):
|
||||||
|
await message.answer("Command not avaible")
|
||||||
|
|
||||||
|
return status
|
|
@ -1,77 +0,0 @@
|
||||||
from aiogram import types
|
|
||||||
from aiogram.dispatcher.filters import BoundFilter
|
|
||||||
|
|
||||||
# from config import roles
|
|
||||||
from database.database import Member
|
|
||||||
|
|
||||||
class IsAdminFilter(BoundFilter):
|
|
||||||
"""Check admin permission on hadler"""
|
|
||||||
key = 'is_admin'
|
|
||||||
|
|
||||||
def __init__(self, is_admin):
|
|
||||||
self.is_admin = is_admin
|
|
||||||
|
|
||||||
async def check(self, message: types.Message):
|
|
||||||
member = await message.bot.get_chat_member(message.chat.id, message.from_user.id)
|
|
||||||
result = member.is_chat_admin()
|
|
||||||
if not result:
|
|
||||||
await message.reply("🔒This command can only be used by an admin!")
|
|
||||||
return result
|
|
||||||
|
|
||||||
class UserHasRights(BoundFilter):
|
|
||||||
"""Check command in user rights"""
|
|
||||||
|
|
||||||
key = 'hasRights'
|
|
||||||
|
|
||||||
def __init__(self,hasRights):
|
|
||||||
self.hasRights = hasRights
|
|
||||||
|
|
||||||
async def check(self,message:types.Message):
|
|
||||||
import config
|
|
||||||
from load import database
|
|
||||||
|
|
||||||
roles = config.roles["roles"]
|
|
||||||
|
|
||||||
command = message.text.split()[0].lstrip("!")
|
|
||||||
|
|
||||||
user = database.search_single_member(Member.user_id,message.from_user.id)
|
|
||||||
|
|
||||||
# If data not exists,return False
|
|
||||||
if (user is None):
|
|
||||||
return False
|
|
||||||
|
|
||||||
# If role not exist,return False.
|
|
||||||
if not (user.role in roles.keys()):
|
|
||||||
return False
|
|
||||||
|
|
||||||
can_run_it = roles[user.role][command]
|
|
||||||
|
|
||||||
replied = message.reply_to_message
|
|
||||||
|
|
||||||
if (replied):
|
|
||||||
if (replied.from_user.id == message.from_user.id):
|
|
||||||
await message.answer("❌ You can't ")
|
|
||||||
return False
|
|
||||||
|
|
||||||
if (str(replied.from_user.id) == config.token.split(":")[0]):
|
|
||||||
await message.answer("You can't restrict bot.")
|
|
||||||
return False
|
|
||||||
|
|
||||||
if not (can_run_it):
|
|
||||||
await message.answer("You can't use this command.")
|
|
||||||
return False
|
|
||||||
|
|
||||||
return roles[user.role][command]
|
|
||||||
|
|
||||||
class ReplayMessageFilter(BoundFilter):
|
|
||||||
"""Check if message replied"""
|
|
||||||
key = 'replied'
|
|
||||||
|
|
||||||
def __init__(self, replied):
|
|
||||||
self.replied = replied
|
|
||||||
|
|
||||||
async def check(self, message: types.Message):
|
|
||||||
if message.reply_to_message is None:
|
|
||||||
await message.reply("Is command must be reply")
|
|
||||||
return False
|
|
||||||
return True
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
from aiogram import types
|
||||||
|
from aiogram.dispatcher.filters import BoundFilter
|
||||||
|
|
||||||
|
class ReplayMessageFilter(BoundFilter):
|
||||||
|
"""Check if message replied"""
|
||||||
|
key = 'replied'
|
||||||
|
|
||||||
|
def __init__(self, replied):
|
||||||
|
self.replied = replied
|
||||||
|
|
||||||
|
async def check(self, message: types.Message):
|
||||||
|
if message.reply_to_message is None:
|
||||||
|
await message.reply("Is command must be reply")
|
||||||
|
return False
|
||||||
|
return True
|
|
@ -1,5 +1,4 @@
|
||||||
from . import groups
|
|
||||||
from . import private
|
|
||||||
from . import channels
|
|
||||||
from . import event
|
|
||||||
from . import errors
|
from . import errors
|
||||||
|
from . import groups
|
||||||
|
from . import users
|
||||||
|
from . import channels
|
||||||
|
|
|
@ -15,9 +15,9 @@ async def errors_handler(update, exception):
|
||||||
await update.message.answer("Error happaned!\nBot terminated!")
|
await update.message.answer("Error happaned!\nBot terminated!")
|
||||||
|
|
||||||
await bot.send_message(
|
await bot.send_message(
|
||||||
config.telegram_log_chat_id,
|
config.second_group_id,
|
||||||
f"**Bot terminated**!\nException:{exception}",
|
f"**Bot terminated**!\nException:{exception}",
|
||||||
parse_mode="Markdown"
|
parse_mode="Markdown"
|
||||||
)
|
)
|
||||||
|
|
||||||
logging.info(f"Bot terminated!Exception:{exception}")
|
logging.info(f"Bot terminated!")
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
from load import dp, bot, types
|
|
||||||
|
|
||||||
# TODO: fix it
|
|
||||||
# import utils
|
|
||||||
# import config
|
|
||||||
# vt = utils.VirusTotalAPI(config.vt_api,True)
|
|
||||||
# @dp.message_handler(content_types=["document"],chat_type=[types.ChatType.SUPERGROUP])
|
|
||||||
# async def file_handler(message:types.Message):
|
|
||||||
# file = await bot.get_file(message.document.file_id)
|
|
||||||
#
|
|
||||||
# await bot.send_message(
|
|
||||||
# message.chat.id,
|
|
||||||
# await vt.scan_file(file.file_path),
|
|
||||||
# parse_mode="Markdown"
|
|
||||||
# )
|
|
||||||
|
|
||||||
@dp.message_handler()
|
|
||||||
async def filter_link_shorts(message:types.Message):
|
|
||||||
link_shorters = open("txt/link_shorters.txt","r").read().split()
|
|
||||||
|
|
||||||
for y in link_shorters:
|
|
||||||
for user_message in message.text.lower().split():
|
|
||||||
if (y in user_message):await message.delete()
|
|
||||||
|
|
||||||
# Joke
|
|
||||||
@dp.message_handler(content_types=types.ContentType.VOICE)
|
|
||||||
async def voice_message(message:types.Message):
|
|
||||||
photo = types.InputFile(path_or_bytesio="media/photo.jpg")
|
|
||||||
await message.answer_photo(photo)
|
|
|
@ -1,2 +1,3 @@
|
||||||
from . import admin
|
from . import moderator
|
||||||
from . import user
|
from . import user
|
||||||
|
from . import service
|
||||||
|
|
|
@ -1,23 +1,23 @@
|
||||||
from load import bot, dp, types
|
from load import bot, database, dp, types
|
||||||
from aiogram.types.chat_permissions import ChatPermissions
|
from aiogram.types.chat_permissions import ChatPermissions
|
||||||
|
|
||||||
import config
|
import config
|
||||||
import utils
|
import utils
|
||||||
|
|
||||||
from load import database
|
|
||||||
from database.models import Member
|
from database.models import Member
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import json
|
|
||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
from database.models import MemberRoles
|
||||||
|
|
||||||
def getArgument(arguments:list,index:int=0) -> str | None:
|
def getArgument(arguments:list,index:int=0) -> str | None:
|
||||||
""" Get element from a list.If element not exist return None """
|
""" Get element from a list.If element not exist return None """
|
||||||
if not (arguments):
|
if not (arguments):
|
||||||
return None
|
return None
|
||||||
if (len(arguments) >= index):
|
|
||||||
|
if (len(arguments) > index):
|
||||||
return arguments[index]
|
return arguments[index]
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
@ -30,10 +30,9 @@ class CommandArguments:
|
||||||
async def getCommandArgs(message:types.Message) -> CommandArguments:
|
async def getCommandArgs(message:types.Message) -> CommandArguments:
|
||||||
""" Describe user data and arguments from message """
|
""" Describe user data and arguments from message """
|
||||||
|
|
||||||
#Example:
|
"""
|
||||||
#1.!command @username ... (not reply)
|
!command (@username/id) reason=None
|
||||||
#2.!command (not_reply)
|
"""
|
||||||
#3.!command ... (not reply)
|
|
||||||
|
|
||||||
arguments_list = message.text.split()[1:]
|
arguments_list = message.text.split()[1:]
|
||||||
|
|
||||||
|
@ -68,23 +67,36 @@ def checkArg(message:str) -> bool | None:
|
||||||
if (not message):
|
if (not message):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
argument = message.split()[1]
|
argument = message.split()
|
||||||
|
argument = getArgument(message.split(),1)
|
||||||
|
|
||||||
|
if (argument is None):
|
||||||
|
return None
|
||||||
|
|
||||||
on = ['enable','on','true']
|
on = ['enable','on','true']
|
||||||
off = ['disable','off','false']
|
off = ['disable','off','false']
|
||||||
|
|
||||||
return (argument in on) or (not argument in off)
|
if (argument in on):
|
||||||
|
return True
|
||||||
|
if (argument in off):
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def delete_substring_from_string(string:str,substring:str) -> str:
|
def delete_substring_from_string(string:str,substring:str) -> str:
|
||||||
string_list = string.split(substring)
|
string_list = string.split(substring)
|
||||||
return "".join(string_list).lstrip()
|
return "".join(string_list).lstrip()
|
||||||
|
|
||||||
# Filters:
|
# Filters:
|
||||||
# is_admin=True - Check admin permission, if user is admin, continue
|
# is_admin=True - Check admin permission, if user is admin, continue.
|
||||||
# replied=True - If message is answer, continue
|
# replied=True - If message is answer, continue.
|
||||||
|
# accessed_roles - list roles.
|
||||||
|
|
||||||
@dp.message_handler(commands=["ban"],commands_prefix="!",hasRights=True)
|
@dp.message_handler(commands=["ban"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.ADMIN,MemberRoles.HELPER])
|
||||||
async def ban_user(message: types.Message):
|
async def ban_user(message: types.Message):
|
||||||
|
"""
|
||||||
|
!ban (@username/id) reason=None
|
||||||
|
"""
|
||||||
command = await getCommandArgs(message)
|
command = await getCommandArgs(message)
|
||||||
reason = getArgument(command.arguments)
|
reason = getArgument(command.arguments)
|
||||||
|
|
||||||
|
@ -94,7 +106,7 @@ async def ban_user(message: types.Message):
|
||||||
# If can't descibe user data
|
# If can't descibe user data
|
||||||
if (user is None):
|
if (user is None):
|
||||||
await message.answer((
|
await message.answer((
|
||||||
"Usage:!ban @username reason=None"
|
"Usage:!ban (@username|id) reason=None.\n"
|
||||||
"Reply to a message or use with a username.")
|
"Reply to a message or use with a username.")
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
@ -110,17 +122,22 @@ async def ban_user(message: types.Message):
|
||||||
database.delete_user(user.user_id)
|
database.delete_user(user.user_id)
|
||||||
|
|
||||||
# Open restrict
|
# Open restrict
|
||||||
database.create_restriction(user.user_id, admin.id, "ban", reason)
|
database.create_restriction(admin.id, user.user_id, "ban", reason)
|
||||||
|
|
||||||
@dp.message_handler(commands=["unban"],commands_prefix="!",hasRights=True)
|
|
||||||
|
@dp.message_handler(commands=["unban"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.ADMIN,MemberRoles.HELPER])
|
||||||
async def unban_user(message: types.Message):
|
async def unban_user(message: types.Message):
|
||||||
|
"""
|
||||||
|
!unban (@username/id) reason=None
|
||||||
|
"""
|
||||||
command = await getCommandArgs(message)
|
command = await getCommandArgs(message)
|
||||||
user = command.user
|
user = command.user
|
||||||
|
|
||||||
# If can't descibe user data
|
# If can't descibe user data
|
||||||
if (user is None):
|
if (user is None):
|
||||||
await message.answer((
|
await message.answer((
|
||||||
"Usage:!unban @username reason=None\n"
|
"Usage:!unban (@username|id) reason=None.\n"
|
||||||
"Reply to a message or use with username/id.")
|
"Reply to a message or use with username/id.")
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
@ -135,8 +152,14 @@ async def unban_user(message: types.Message):
|
||||||
await message.answer(f"User [{user.first_name}](tg://user?id={user.user_id}) has been unbaned.",
|
await message.answer(f"User [{user.first_name}](tg://user?id={user.user_id}) has been unbaned.",
|
||||||
parse_mode="Markdown")
|
parse_mode="Markdown")
|
||||||
|
|
||||||
@dp.message_handler(commands=["kick"],commands_prefix="!",hasRights=True)
|
|
||||||
|
@dp.message_handler(commands=["kick"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.HELPER,MemberRoles.ADMIN])
|
||||||
async def kick_user(message:types.Message):
|
async def kick_user(message:types.Message):
|
||||||
|
"""
|
||||||
|
!kick (@username/id) reason=None
|
||||||
|
"""
|
||||||
|
|
||||||
command = await getCommandArgs(message)
|
command = await getCommandArgs(message)
|
||||||
arguments = command.arguments
|
arguments = command.arguments
|
||||||
|
|
||||||
|
@ -147,7 +170,7 @@ async def kick_user(message:types.Message):
|
||||||
|
|
||||||
if (user is None):
|
if (user is None):
|
||||||
await message.answer((
|
await message.answer((
|
||||||
"Usage:!kick @username reason=None\n"
|
"Usage:!kick (@username|id) reason=None.\n"
|
||||||
"Reply to a message or use with a username/id.")
|
"Reply to a message or use with a username/id.")
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
@ -160,10 +183,16 @@ async def kick_user(message:types.Message):
|
||||||
await message.answer(f"User [{user.first_name}](tg://user?id={user.user_id}) has been kicked.",
|
await message.answer(f"User [{user.first_name}](tg://user?id={user.user_id}) has been kicked.",
|
||||||
parse_mode="Markdown")
|
parse_mode="Markdown")
|
||||||
|
|
||||||
database.create_restriction(user.user_id,admin.id,"kick",reason)
|
database.create_restriction(admin.id,user.user_id,"kick",reason)
|
||||||
|
|
||||||
@dp.message_handler(commands=["mute"],commands_prefix="!",hasRights=True)
|
|
||||||
|
@dp.message_handler(commands=["mute"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.ADMIN])
|
||||||
async def mute_user(message:types.Message):
|
async def mute_user(message:types.Message):
|
||||||
|
"""
|
||||||
|
!mute (@username/id) reason=None
|
||||||
|
"""
|
||||||
|
|
||||||
command = await getCommandArgs(message)
|
command = await getCommandArgs(message)
|
||||||
arguments = command.arguments
|
arguments = command.arguments
|
||||||
|
|
||||||
|
@ -172,7 +201,7 @@ async def mute_user(message:types.Message):
|
||||||
|
|
||||||
if (user is None):
|
if (user is None):
|
||||||
await message.answer((
|
await message.answer((
|
||||||
"Usage:!mute @username time\n"
|
"Usage:!mute (@username|id) [duration].\n"
|
||||||
"Reply to a message or use with a username/id.")
|
"Reply to a message or use with a username/id.")
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
@ -199,10 +228,15 @@ async def mute_user(message:types.Message):
|
||||||
await message.answer(f"User **{user.first_name}** has been muted.",
|
await message.answer(f"User **{user.first_name}** has been muted.",
|
||||||
parse_mode="Markdown")
|
parse_mode="Markdown")
|
||||||
|
|
||||||
database.create_restriction(user.user_id,admin.id,"mute",reason)
|
database.create_restriction(user.user_id, admin.id, "mute", reason)
|
||||||
|
|
||||||
@dp.message_handler(commands=["umute"],commands_prefix="!",hasRights=True)
|
|
||||||
|
@dp.message_handler(commands=["umute"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.ADMIN])
|
||||||
async def umute_user(message: types.Message):
|
async def umute_user(message: types.Message):
|
||||||
|
"""
|
||||||
|
!umute (@username/id) reason=None
|
||||||
|
"""
|
||||||
# Get information
|
# Get information
|
||||||
command = await getCommandArgs(message)
|
command = await getCommandArgs(message)
|
||||||
user = command.user
|
user = command.user
|
||||||
|
@ -210,13 +244,13 @@ async def umute_user(message: types.Message):
|
||||||
# If can't
|
# If can't
|
||||||
if (user is None):
|
if (user is None):
|
||||||
await message.answer((
|
await message.answer((
|
||||||
"Usage:!unmute @username reason=None\n"
|
"Usage:!unmute (@username|id) reason=None.\n"
|
||||||
"Reply to a message or use with a username/id.")
|
"Reply to a message or use with a username/id.")
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Get chat permissions
|
# Get chat permissions
|
||||||
group_permissions = config.roles["group_permissions"]
|
group_permissions = config.group_permissions
|
||||||
|
|
||||||
# Set permissions
|
# Set permissions
|
||||||
permissions = ChatPermissions(
|
permissions = ChatPermissions(
|
||||||
|
@ -241,12 +275,17 @@ async def umute_user(message: types.Message):
|
||||||
await message.answer(f"User [{user.first_name}](tg://user?id={user.user_id}) has been unmuted.",
|
await message.answer(f"User [{user.first_name}](tg://user?id={user.user_id}) has been unmuted.",
|
||||||
parse_mode="Markdown")
|
parse_mode="Markdown")
|
||||||
|
|
||||||
@dp.message_handler(commands=["pin"],commands_prefix="!",hasRights=True)
|
@dp.message_handler(commands=["pin"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.ADMIN,MemberRoles.HELPER])
|
||||||
async def pin_message(message:types.Message):
|
async def pin_message(message:types.Message):
|
||||||
await bot.pin_chat_message(message.chat.id, message.reply_to_message.message_id)
|
await bot.pin_chat_message(message.chat.id, message.reply_to_message.message_id)
|
||||||
|
|
||||||
@dp.message_handler(commands=["ro"],commands_prefix="!",hasRights=True)
|
@dp.message_handler(commands=["readonly","ro"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.ADMIN])
|
||||||
async def readonly_mode(message:types.Message):
|
async def readonly_mode(message:types.Message):
|
||||||
|
"""
|
||||||
|
!ro/!readonly (@username/id)
|
||||||
|
"""
|
||||||
check = checkArg(message.text)
|
check = checkArg(message.text)
|
||||||
|
|
||||||
if (check is None):
|
if (check is None):
|
||||||
|
@ -254,7 +293,7 @@ async def readonly_mode(message:types.Message):
|
||||||
return
|
return
|
||||||
|
|
||||||
# Get chat permissions
|
# Get chat permissions
|
||||||
group_permissions = config.roles["group_permissions"]
|
group_permissions = config.group_permissions
|
||||||
|
|
||||||
# Set permissions
|
# Set permissions
|
||||||
if (check):
|
if (check):
|
||||||
|
@ -278,7 +317,9 @@ async def readonly_mode(message:types.Message):
|
||||||
if (status):
|
if (status):
|
||||||
await message.answer(f"readonly - {check}")
|
await message.answer(f"readonly - {check}")
|
||||||
|
|
||||||
@dp.message_handler(commands=["media"],commands_prefix="!",hasRights=True)
|
|
||||||
|
@dp.message_handler(commands=["media"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.ADMIN,MemberRoles.HELPER])
|
||||||
async def media_content(message: types.Message):
|
async def media_content(message: types.Message):
|
||||||
check = checkArg(message.text)
|
check = checkArg(message.text)
|
||||||
|
|
||||||
|
@ -287,7 +328,7 @@ async def media_content(message: types.Message):
|
||||||
return
|
return
|
||||||
|
|
||||||
# Get chat permissions
|
# Get chat permissions
|
||||||
group_permissions = config.roles["group_permissions"]
|
group_permissions = config.group_permissions
|
||||||
|
|
||||||
# Set permissions
|
# Set permissions
|
||||||
chat_permissions = ChatPermissions(
|
chat_permissions = ChatPermissions(
|
||||||
|
@ -307,8 +348,10 @@ async def media_content(message: types.Message):
|
||||||
if status:
|
if status:
|
||||||
await message.answer(f"media - {check}.")
|
await message.answer(f"media - {check}.")
|
||||||
|
|
||||||
@dp.message_handler(commands=["stickers"],commands_prefix="!",hasRights=True)
|
|
||||||
async def send_stickes(message: types.Message):
|
@dp.message_handler(commands=["stickers"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.ADMIN,MemberRoles.HELPER])
|
||||||
|
async def send_stickers(message: types.Message):
|
||||||
# Get arguments
|
# Get arguments
|
||||||
check = checkArg(message.text)
|
check = checkArg(message.text)
|
||||||
|
|
||||||
|
@ -317,7 +360,7 @@ async def send_stickes(message: types.Message):
|
||||||
return
|
return
|
||||||
|
|
||||||
# Get chat permissions
|
# Get chat permissions
|
||||||
group_permissions = config.roles["group_permissions"]
|
group_permissions = config.group_permissions
|
||||||
|
|
||||||
# Set permissions.
|
# Set permissions.
|
||||||
chat_permissions = ChatPermissions(
|
chat_permissions = ChatPermissions(
|
||||||
|
@ -337,7 +380,9 @@ async def send_stickes(message: types.Message):
|
||||||
if status:
|
if status:
|
||||||
await message.answer(f"stickes - {check}.")
|
await message.answer(f"stickes - {check}.")
|
||||||
|
|
||||||
@dp.message_handler(commands=["warn"],commands_prefix="!",hasRights=True)
|
|
||||||
|
@dp.message_handler(commands=["w","warn"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.ADMIN,MemberRoles.HELPER])
|
||||||
async def warn_user(message: types.Message):
|
async def warn_user(message: types.Message):
|
||||||
# Get information
|
# Get information
|
||||||
command = await getCommandArgs(message)
|
command = await getCommandArgs(message)
|
||||||
|
@ -348,7 +393,7 @@ async def warn_user(message: types.Message):
|
||||||
|
|
||||||
if (user is None):
|
if (user is None):
|
||||||
await message.answer((
|
await message.answer((
|
||||||
"Usage:!warn @username reason=None\n"
|
"Usage:!warn (@username/id) reason=None.\n"
|
||||||
"Reply to a message or use with username/id.")
|
"Reply to a message or use with username/id.")
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
@ -361,48 +406,37 @@ async def warn_user(message: types.Message):
|
||||||
|
|
||||||
database.create_restriction(user.user_id, admin.id, "warn", reason)
|
database.create_restriction(user.user_id, admin.id, "warn", reason)
|
||||||
|
|
||||||
@dp.message_handler(commands=["reload"],commands_prefix="!")
|
|
||||||
|
@dp.message_handler(commands=["reload"],commands_prefix="!",available_roles=[MemberRoles.ADMIN,MemberRoles.HELPER])
|
||||||
async def reload(message:types.Message):
|
async def reload(message:types.Message):
|
||||||
await utils.check_user_data()
|
await utils.check_user_data()
|
||||||
|
|
||||||
group = await bot.get_chat(message.chat.id)
|
group = await bot.get_chat(message.chat.id)
|
||||||
group_permissions = dict(group["permissions"])
|
group_permissions = dict(group["permissions"])
|
||||||
|
|
||||||
with open("config/roles.json","r") as jsonfile:
|
|
||||||
data = json.load(jsonfile)
|
|
||||||
|
|
||||||
if group_permissions.keys() != data["group_permissions"].keys():
|
|
||||||
await message.answer("Add some permissions to roles.json")
|
|
||||||
return
|
|
||||||
|
|
||||||
for permission in group_permissions.keys():
|
for permission in group_permissions.keys():
|
||||||
data["group_permissions"][permission] = group_permissions[permission]
|
config.group_permissions[permission] = group_permissions[permission]
|
||||||
|
|
||||||
with open("config/roles.json", "w") as jsonfile:
|
|
||||||
json.dump(data, jsonfile,indent=4)
|
|
||||||
|
|
||||||
await message.answer(f"✅ The synchronization was successful.")
|
await message.answer(f"✅ The synchronization was successful.")
|
||||||
|
|
||||||
@dp.message_handler(commands=["srole"],commands_prefix="!",hasRights=True)
|
|
||||||
|
@dp.message_handler(commands=["set_role"],commands_prefix="!",
|
||||||
|
available_roles=[MemberRoles.ADMIN])
|
||||||
async def set_role(message:types.Message):
|
async def set_role(message:types.Message):
|
||||||
command = await getCommandArgs(message)
|
command = await getCommandArgs(message)
|
||||||
new_role = getArgument(command.arguments)
|
new_role = getArgument(command.arguments)
|
||||||
|
|
||||||
roles = config.roles
|
|
||||||
|
|
||||||
user = command.user
|
user = command.user
|
||||||
admin = database.search_single_member(Member.user_id,message.from_user)
|
admin = database.search_single_member(Member.user_id,message.from_user)
|
||||||
|
|
||||||
if (admin is None):
|
|
||||||
return
|
|
||||||
|
|
||||||
if (user is None) or (new_role is None):
|
if (user is None) or (new_role is None):
|
||||||
await message.answer("""
|
await message.answer((
|
||||||
!srole @username/id role(owner,admin,helper,member)
|
"!srole (@username|id) role(owner,admin,helper,member).\n"
|
||||||
Reply to a message or use with username.""")
|
"Reply to a message or use with username."
|
||||||
|
))
|
||||||
return
|
return
|
||||||
|
|
||||||
if not (new_role in roles["level"].keys()):
|
if not (new_role in [member.value for member in MemberRoles]):
|
||||||
await message.answer(f"Role {new_role} not exists.")
|
await message.answer(f"Role {new_role} not exists.")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -410,11 +444,6 @@ Reply to a message or use with username.""")
|
||||||
await message.answer("❌ You can't set role yourself.")
|
await message.answer("❌ You can't set role yourself.")
|
||||||
return
|
return
|
||||||
|
|
||||||
if (roles['level'][new_role] > roles['level'][admin.role]):
|
|
||||||
await message.answer("Your rank is not high enough to change roles.")
|
|
||||||
return
|
|
||||||
|
|
||||||
database.update_member_data(user.user_id,[Member.role],[new_role])
|
database.update_member_data(user.user_id,[Member.role],[new_role])
|
||||||
|
|
||||||
await message.answer(f"{new_role.capitalize()} role set for [{user.first_name}](tg://user?id={user.user_id}).",
|
await message.answer(f"{new_role.capitalize()} role set for [{user.first_name}](tg://user?id={user.user_id}).",parse_mode="Markdown")
|
||||||
parse_mode="Markdown")
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
from load import dp, database, types
|
||||||
|
from database.models import Member
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: fix it
|
||||||
|
# import utils
|
||||||
|
# import config
|
||||||
|
# vt = utils.VirusTotalAPI(config.vt_api,True)
|
||||||
|
# @dp.message_handler(content_types=["document"],chat_type=[types.ChatType.SUPERGROUP])
|
||||||
|
# async def file_handler(message:types.Message):
|
||||||
|
# file = await bot.get_file(message.document.file_id)
|
||||||
|
#
|
||||||
|
# await bot.send_message(
|
||||||
|
# message.chat.id,
|
||||||
|
# await vt.scan_file(file.file_path),
|
||||||
|
# parse_mode="Markdown"
|
||||||
|
# )
|
||||||
|
|
||||||
|
@dp.message_handler(content_types=["new_chat_members"])
|
||||||
|
async def welcome_message(message:types.Message):
|
||||||
|
# User
|
||||||
|
user = message.from_user
|
||||||
|
|
||||||
|
exists = database.check_data_exists(Member.user_id,user.id)
|
||||||
|
|
||||||
|
if (exists):
|
||||||
|
await message.answer("Спасибо что вы с нами.")
|
||||||
|
|
||||||
|
if not (exists):
|
||||||
|
database.register_user(user.id,user.first_name,user.username)
|
||||||
|
# TODO: translate it
|
||||||
|
await message.answer((
|
||||||
|
f"Привет,{user.first_name}\n"
|
||||||
|
"Просим ознакомится с [правилами](https://telegra.ph/Pravila-CHata-Open-Source-05-29)\n"
|
||||||
|
"Советы на 'хороший тон':\n"
|
||||||
|
"\t\t1.Формулируй свою мысль в 1-2 предложения\n"
|
||||||
|
"\t\t1.Не задавай [мета](nometa.xyz) вопросы\n"),
|
||||||
|
parse_mode="Markdown")
|
||||||
|
|
||||||
|
|
||||||
|
await message.delete()
|
||||||
|
|
||||||
|
# @dp.message_handler()
|
||||||
|
# async def filter_link_shorts(message:types.Message):
|
||||||
|
# link_shorters = open("txt/link_shorters.txt","r").read().split()
|
||||||
|
#
|
||||||
|
# for y in link_shorters:
|
||||||
|
# for user_message in message.text.lower().split():
|
||||||
|
# if (y in user_message):await message.delete()
|
||||||
|
|
||||||
|
# Joke
|
||||||
|
@dp.message_handler(content_types=types.ContentType.VOICE)
|
||||||
|
async def voice_message(message:types.Message):
|
||||||
|
photo = types.InputFile(path_or_bytesio="media/photo.jpg")
|
||||||
|
await message.answer_photo(photo)
|
|
@ -5,31 +5,6 @@ import config
|
||||||
from load import database
|
from load import database
|
||||||
from database.models import Member
|
from database.models import Member
|
||||||
|
|
||||||
|
|
||||||
@dp.message_handler(content_types=["new_chat_members"])
|
|
||||||
async def welcome_message(message:types.Message):
|
|
||||||
# User
|
|
||||||
user = message.from_user
|
|
||||||
|
|
||||||
exists = database.check_data_exists(Member.user_id,user.id)
|
|
||||||
|
|
||||||
if (exists):
|
|
||||||
await message.answer("Спасибо что вы с нами.")
|
|
||||||
|
|
||||||
if not (exists):
|
|
||||||
database.register_user(user.id,user.first_name,user.username)
|
|
||||||
# TODO: translate it
|
|
||||||
await message.answer((
|
|
||||||
f"Привет,{user.first_name}\n"
|
|
||||||
"Просим ознакомится с [правилами](https://telegra.ph/Pravila-CHata-Open-Source-05-29)\n"
|
|
||||||
"Советы на 'хороший тон':\n"
|
|
||||||
"\t\t1.Формулируй свою мысль в 1-2 предложения\n"
|
|
||||||
"\t\t1.Не задавай [мета](nometa.xyz) вопросы\n"),
|
|
||||||
parse_mode="Markdown")
|
|
||||||
|
|
||||||
|
|
||||||
await message.delete()
|
|
||||||
|
|
||||||
@dp.message_handler(commands=["leave"],chat_type=[types.ChatType.SUPERGROUP])
|
@dp.message_handler(commands=["leave"],chat_type=[types.ChatType.SUPERGROUP])
|
||||||
async def leave_group(message:types.Message):
|
async def leave_group(message:types.Message):
|
||||||
user = message.from_user
|
user = message.from_user
|
||||||
|
@ -59,6 +34,7 @@ async def start_command_group(message:types.Message):
|
||||||
parse_mode="Markdown"
|
parse_mode="Markdown"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dp.message_handler(commands=["bio","me"],chat_type=[types.ChatType.SUPERGROUP])
|
@dp.message_handler(commands=["bio","me"],chat_type=[types.ChatType.SUPERGROUP])
|
||||||
async def get_information(message: types.Message):
|
async def get_information(message: types.Message):
|
||||||
user = database.search_single_member(Member.user_id,message.from_user.id)
|
user = database.search_single_member(Member.user_id,message.from_user.id)
|
||||||
|
@ -75,6 +51,7 @@ async def get_information(message: types.Message):
|
||||||
parse_mode="Markdown"
|
parse_mode="Markdown"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dp.message_handler(commands=["report"],replied=True,chat_type=[types.ChatType.SUPERGROUP])
|
@dp.message_handler(commands=["report"],replied=True,chat_type=[types.ChatType.SUPERGROUP])
|
||||||
async def report(message: types.Message):
|
async def report(message: types.Message):
|
||||||
args = message.text.split()
|
args = message.text.split()
|
||||||
|
@ -97,8 +74,4 @@ async def report(message: types.Message):
|
||||||
message.reply_to_message.link("Link message", as_html=False)
|
message.reply_to_message.link("Link message", as_html=False)
|
||||||
))
|
))
|
||||||
|
|
||||||
await bot.send_message(config.telegram_log_chat_id, msg, parse_mode="Markdown")
|
await bot.send_message(config.second_group_id, msg, parse_mode="Markdown")
|
||||||
|
|
||||||
@dp.message_handler(content_types=["left_chat_member"])
|
|
||||||
async def event_left_chat(message:types.Message):
|
|
||||||
await message.delete()
|
|
||||||
|
|
|
@ -19,9 +19,9 @@ from keyboards.inline.callback_data import report_callback
|
||||||
@dp.message_handler(commands=["start","help"],chat_type=[types.ChatType.PRIVATE])
|
@dp.message_handler(commands=["start","help"],chat_type=[types.ChatType.PRIVATE])
|
||||||
async def start_command_private(message:types.Message):
|
async def start_command_private(message:types.Message):
|
||||||
await message.answer((
|
await message.answer((
|
||||||
"Hello,**{message.from_user.first_name}**!\n"
|
f"Hello,**{message.from_user.first_name}**!\n"
|
||||||
"\t\tMy commands:\n"
|
"My commands:\n"
|
||||||
"\t\t/help , /start - read this message.")
|
"\t\t/help /start - read this message.")
|
||||||
,parse_mode="Markdown",reply_markup=menu
|
,parse_mode="Markdown",reply_markup=menu
|
||||||
)
|
)
|
||||||
|
|
6
load.py
6
load.py
|
@ -5,7 +5,7 @@ from aiogram.contrib.fsm_storage.memory import MemoryStorage
|
||||||
|
|
||||||
import config
|
import config
|
||||||
import utils
|
import utils
|
||||||
import filters
|
|
||||||
|
|
||||||
from database.database import Database
|
from database.database import Database
|
||||||
|
|
||||||
|
@ -23,7 +23,3 @@ bot = Bot(
|
||||||
)
|
)
|
||||||
|
|
||||||
dp = Dispatcher(bot, storage=storage)
|
dp = Dispatcher(bot, storage=storage)
|
||||||
|
|
||||||
dp.filters_factory.bind(filters.IsAdminFilter)
|
|
||||||
dp.filters_factory.bind(filters.ReplayMessageFilter)
|
|
||||||
dp.filters_factory.bind(filters.UserHasRights)
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import config
|
import config
|
||||||
|
|
||||||
async def notify_started_bot(bot):
|
async def notify_started_bot(bot):
|
||||||
await bot.send_message(config.telegram_log_chat_id,"Bot started!")
|
await bot.send_message(config.second_group_id,"Bot started!")
|
||||||
|
|
|
@ -16,7 +16,6 @@ class TelegramClient:
|
||||||
members = []
|
members = []
|
||||||
|
|
||||||
async for member in self.client.get_chat_members(chat_id):
|
async for member in self.client.get_chat_members(chat_id):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
username = member.user.username
|
username = member.user.username
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
|
|
Reference in New Issue