Add new ban rules

This commit is contained in:
Rykov7
2023-09-02 19:06:37 +03:00
parent 7a3c78d813
commit 3248bb6842
7 changed files with 121 additions and 37 deletions
@@ -0,0 +1,24 @@
"""add permissions
Revision ID: 1b1f99b95b38
Revises: 9d160884887c
Create Date: 2023-07-30 18:33:35.400071
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '1b1f99b95b38'
down_revision = '9d160884887c'
branch_labels = None
depends_on = None
def upgrade() -> None:
pass
def downgrade() -> None:
pass
-28
View File
@@ -1,28 +0,0 @@
from telebot.types import LabeledPrice, Message, PreCheckoutQuery
from ..config import YOOPAY, bot
prices = [LabeledPrice("Сумма", 100_00)]
@bot.message_handler(commands=["donate"])
def request_invoice(message: Message):
bot.send_invoice(
message.chat.id,
"Поддержать проект",
"Stan",
"donate_stan",
provider_token=YOOPAY,
currency="RUB",
prices=prices,
provider_data='{"capture": true}',
max_tip_amount=500_000_00,
suggested_tip_amounts=[150_00, 300_00, 500_00, 1_000_00],
capture=True,
)
@bot.pre_checkout_query_handler(func=lambda a: True)
def process_pre_checkout(q: PreCheckoutQuery):
bot.answer_pre_checkout_query(
q.id, True, "Извините, пожертвования больше не принимаем!"
)
+22 -1
View File
@@ -3,7 +3,7 @@
import logging import logging
from telebot import logger from telebot import logger
from datetime import datetime as dt from datetime import datetime as dt
from ..models import Chat, Quote from ..models import Chat, Quote, User
from ..database import session from ..database import session
from ..config import bot, ADMIN_ID, types from ..config import bot, ADMIN_ID, types
from .. import reminder from .. import reminder
@@ -193,3 +193,24 @@ def set_logging_level(message: types.Message):
else: else:
logger.setLevel(20) # INFO logger.setLevel(20) # INFO
logging.info("[LEVEL] Установлен уровень INFO") logging.info("[LEVEL] Установлен уровень INFO")
@bot.message_handler(func=is_admin, commands="promote", chat_types=["supergroup", "group"])
def promote_user(message: types.Message):
if message.reply_to_message:
user = message.reply_to_message.from_user
user_db = session.query(User).filter_by(tg_id=user.id)
if not user_db:
permission = 1
session.add(tg_id=user.id,
first_name=user.first_name,
last_name=user.last_name,
username=user.username,
permissions=permission)
else:
permission = user_db.permission * 2
user_db.update(permissions=permission)
session.commit()
logger.info(f'[{user.first_name} {user.last_name}] повышен до {permission}.')
+1 -1
View File
@@ -80,7 +80,7 @@ FAQ = types.InlineKeyboardButton(
LIB = types.InlineKeyboardButton("📚 Книги", url="https://telegra.ph/what-to-read-10-06") LIB = types.InlineKeyboardButton("📚 Книги", url="https://telegra.ph/what-to-read-10-06")
SPAM = ["me.sv/", "tg.sv/", "goo.by/", "go.sv/", "intim.video/", "uclck.ru/", 'раб0т', SPAM = ["me.sv/", "tg.sv/", "goo.by/", "go.sv/", "intim.video/", "uclck.ru/", 'раб0т',
'0плат', ] '0плат', 'Жду в ЛС!', 'новый способ заработка', 'криптовалют']
NON_GRATA = ["дудар", "хауди", "dudar"] NON_GRATA = ["дудар", "хауди", "dudar"]
BAN_WORDS = ["GREEN"] BAN_WORDS = ["GREEN"]
+2 -3
View File
@@ -7,12 +7,11 @@ def in_spam_list(message: types.Message) -> bool:
"""Check for mentioning unwanted persons in text.""" """Check for mentioning unwanted persons in text."""
antispam_is_enabled = session.query(Chat.antispam).filter_by(chat_id=message.chat.id).first()[0] antispam_is_enabled = session.query(Chat.antispam).filter_by(chat_id=message.chat.id).first()[0]
if message.from_user.id not in WHITEIDS and antispam_is_enabled: if message.from_user.id not in WHITEIDS and antispam_is_enabled:
for url in SPAM: for text in SPAM:
if url in message.text.casefold(): if text in message.text.casefold():
logging.info( logging.info(
"!BAN!" + LOG_COMM % ( "!BAN!" + LOG_COMM % (
message.chat.title, message.from_user.id, message.from_user.first_name, message.text)) message.chat.title, message.from_user.id, message.from_user.first_name, message.text))
return True return True
+68
View File
@@ -1,8 +1,17 @@
from sqlalchemy import Column, String, Integer, Boolean, ForeignKey from sqlalchemy import Column, String, Integer, Boolean, ForeignKey
from sqlalchemy.orm import relationship, declarative_base from sqlalchemy.orm import relationship, declarative_base
from .database import session
Base = declarative_base() Base = declarative_base()
class Permission:
USE_COMMANDS = 1 # Пользоваться обычными командами.
SEND_LINKS = 2 # Может отправлять ссылки без удаления.
MODIFY_QUOTES = 4 # Может добавлять и удалять цитаты.
MODERATE = 8
ADMIN = 16 # Может банить юзеров и удалять сообщения.
class Quote(Base): class Quote(Base):
__tablename__ = "quotes" __tablename__ = "quotes"
@@ -25,6 +34,65 @@ class Chat(Base):
antispam = Column(Boolean) antispam = Column(Boolean)
report = Column(Boolean) report = Column(Boolean)
reminder = Column(Boolean) reminder = Column(Boolean)
hidden = Column(Boolean)
def __repr__(self): def __repr__(self):
return f'Chat({self.chat_id=}, {self.title=})' return f'Chat({self.chat_id=}, {self.title=})'
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
tg_id = Column(Integer, unique=True)
first_name = Column(String)
last_name = Column(String)
username = Column(String)
permissions = Column(Integer)
def __repr__(self):
return f'User({self.first_name} {self.last_name} {self.username})'
class Role(Base):
__tablename__ = 'roles'
id = Column(Integer, primary_key=True)
name = Column(String(64), unique=True)
default = Column(Boolean, default=False, index=True)
permissions = Column(Integer)
users = relationship('User', backref='role', lazy='dynamic')
def add_permission(self, perm):
if not self.has_permission(perm):
self.permissions += perm
def remove_permission(self, perm):
if self.has_permission(perm):
self.permissions -= perm
def reset_permissions(self):
self.permissions = 0
def has_permission(self, perm):
return self.permissions & perm == perm
@staticmethod
def insert_roles():
roles = {
"User": [Permission.USE_COMMANDS],
"Moderator": [Permission.USE_COMMANDS, Permission.SEND_LINKS,
Permission.MODIFY_QUOTES, Permission.MODERATE],
"Administrator": [Permission.USE_COMMANDS, Permission.SEND_LINKS,
Permission.MODIFY_QUOTES, Permission.MODERATE,
Permission.ADMIN],
}
default_role = 'User'
for r in roles:
role = Role.query.filter_by(name=r).first()
if role is None:
role = Role(name=r)
role.reset_permissions()
for perm in roles[r]:
role.add_permission(perm)
role.default = (role.name == default_role)
session.add(role)
session.commit()
+4 -4
View File
@@ -31,15 +31,15 @@ def create_report_text(chat_id):
if user.last_name if user.last_name
else user.first_name else user.first_name
) )
top_users += f'\n {i + 1}. {name} [<code>{flooder["Count"]}</code>]' top_users += f'\n{i + 1}. {name} [<code>{flooder["Count"]}</code>]'
if len(flooders) >= 3 or s["Banned"] or s["Deleted"]: if len(flooders) >= 3 or s["Banned"] or s["Deleted"]:
report = f"<code>Hello, World!</code>\n" report = f"Hello, World!\n"
if len(flooders) >= 3: if len(flooders) >= 3:
report += f"\n<b>Топ</b> 🐍{top_users}\n" report += f"\n{top_users}\n"
if s["Banned"] or s["Deleted"]: if s["Banned"] or s["Deleted"]:
report += f""" report += f"""
<b>Заблокировано</b> <b>Удалено</b>
├ Пользователей: <code>{s['Banned']}</code> ├ Пользователей: <code>{s['Banned']}</code>
└ Сообщений: <code>{s['Deleted']}</code> └ Сообщений: <code>{s['Deleted']}</code>
""" """