Skip to content

Commit

Permalink
Merge pull request #10 from teleportx/delta
Browse files Browse the repository at this point in the history
Delta version pre pr
  • Loading branch information
teleportx authored Jul 26, 2024
2 parents 7e067c5 + d76d8c1 commit 272baac
Show file tree
Hide file tree
Showing 104 changed files with 6,122 additions and 415 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -163,4 +163,5 @@ data.json
.setupdb.py
test.py

logs
logs/
.pio/
38 changes: 36 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,36 @@
# URA Project
Бот для того чтобы держать вкурсе, когда ты идешь...
# [YPA Project](https://t.me/uragv_bot)
Бот для того чтобы держать вкурсе, когда ты идешь ...

### Команда
- [Степан Хожемпо](https://github.com/teleportx) - Backend developer & Bot developer
- [Максим Кузнецов](https://github.com/uuuuuno-devops) - Frontend developer & DevOps engineer
- [Алексей Шаблыкин](https://t.me/AllShabCH) - Project manager
- [Матвей Рябчиков](https://github.com/ronanru) - Frontend develover

### История
> C давних времён, с самого зарождения цивилизаций, информация всегда
> была самым ценным ресурсом. Какой смысл в добыче металлов, если ты не
> знаешь, как изготовить из этого металла инструмент? Передача же
> информации была чем-то сакральным, она передавалась от отца к сыну, от
> кузнеца к подмастерью и всегда была на вес золота. Войны выигрывались
> из-за получения ключевой информации о противнике одной из сторон.
>
> Сейчас идёт век глобализации, информация стала более доступной для
> обычного человека, но по настоящему важная информация остаётся скрытой
> в архивах государств, за дверьми домов самых богатых людей мира и в
> памяти учёных, которые не хотят делиться своими знаниями.
>
> И вот, группа энтузиастов, которые хотят явить народу истинные знания,
> представляют вашему вниманию проект УРА! Уведомления Ректальной
> Активности откроет вам глаза на важный аспект нашей жизни, на личную
> жизнь жопы каждого, кто присоединился к нашему проекту.
>
> Всё началось с идеи, что каждый наш друг должен знать, что мы в
> безопасности, что наша жопа открыта для каждого толчка на Земле. Позже
> наша небольшая команда поняла, что в этом нуждается каждый житель
> планеты и мы начали масштабироваться. Мы сделали всё, чтобы каждый
> смог прикоснуться к Big Data, к которой ранее имели доступ только
> самые богатые корпорации и люди планеты. Сегодня наш проект является
> лучшим олицетворением свободы передачи информации всемирного масштаба.
> Мы не остановимся ни перед чем, чтобы каждый мог посрать не в
> одиночестве!
7 changes: 7 additions & 0 deletions api_services/api_middlewares/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from fastapi import FastAPI

from .auth import AuthMiddleware


def setup(app: FastAPI, raise_unauthorized: bool = False):
app.add_middleware(AuthMiddleware, raise_unauthorized=raise_unauthorized)
24 changes: 24 additions & 0 deletions api_services/api_middlewares/auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from fastapi import Request
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import JSONResponse

from db.ApiAuth import ApiToken


class AuthMiddleware(BaseHTTPMiddleware):
def __init__(self, app, raise_unauthorized: bool = False):
super().__init__(app)
self.raise_unauthorized = raise_unauthorized

async def dispatch(self, request: Request, call_next):
token = await ApiToken.get_or_none(token=ApiToken.hash_token(request.headers.get('Authorization', '')))
if token is None:
request.state.user = None
if self.raise_unauthorized:
return JSONResponse({"detail": "Failed auth by token"}, status_code=401)

else:
request.state.user = await token.owner

response = await call_next(request)
return response
12 changes: 12 additions & 0 deletions api_services/srat_service/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM python:3.10-slim-buster

WORKDIR /app

COPY ../requirements.txt requirements.txt
RUN pip3 install -r requirements.txt


COPY .. .

WORKDIR /app/api_services/srat_service
CMD ["fastapi", "run", "main.py", "--port", "80"]
69 changes: 69 additions & 0 deletions api_services/srat_service/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import sys

sys.path.append('..')
sys.path.append('../..')

from typing import Optional

from aiogram import Bot
from fastapi import FastAPI, Request
from pydantic import BaseModel
from starlette.responses import JSONResponse

import brocker
import config
import db
import api_middlewares
import setup_logger
from db.ToiletSessions import SretSession, SretType
from db.User import User
from utils import send_srat_notification

setup_logger.__init__("API srat")

app = FastAPI(docs_url=None, redoc_url=None)
api_middlewares.setup(app, True)


class SratModel(BaseModel):
status: Optional[SretType]


@app.on_event("startup")
async def startup_event():
await db.init()
await brocker.init()

bot = Bot(
token=config.Telegram.token,
parse_mode='html',
)
config.bot = bot


@app.get('/api/srat/', status_code=200, response_model=SratModel)
async def get_srat(request: Request):
user: User = request.state.user

last_open_session = await SretSession.filter(user=user, end=None).get_or_none()
if last_open_session is None:
srat_status = None

else:
srat_status = last_open_session.sret_type

return SratModel(status=srat_status)


@app.post('/api/srat/', status_code=204)
async def set_srat(request: Request, srat: SratModel):
if srat.status is None:
srat.status = 0

user: User = request.state.user

if not await send_srat_notification.verify_action(user, srat.status):
return JSONResponse({"detail": "You cannot make this action"}, status_code=400)

await send_srat_notification.send(user, srat.status)
return
12 changes: 3 additions & 9 deletions autoend_service/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,11 @@ FROM python:3.10-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
COPY ../requirements.txt requirements.txt
RUN pip3 install -r requirements.txt


COPY autoend_service .

COPY utils utils
COPY keyboards keyboards
COPY db db
COPY config.py config.py
COPY setup_logger.py setup_logger.py
COPY .env .env
COPY .. .

WORKDIR /app/autoend_service
CMD ["python3.10", "-m", "main"]
16 changes: 10 additions & 6 deletions autoend_service/main.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
import sys

sys.path.append('..')

import asyncio
from datetime import datetime, timedelta

import pytz
from aiogram import Bot
from loguru import logger
from tortoise import Tortoise
from tortoise.expressions import Q

import brocker
import config
import db
import setup_logger
from db.ToiletSessions import SretSession, SretType
from utils import send_srat_notification

setup_logger.__init__('Notify Service')
setup_logger.__init__('Autoend Service')

autoend_sql = f'''
SELECT sretsession.* FROM sretsession
Expand All @@ -39,7 +41,7 @@ async def end_loop():

try:
await config.bot.send_message(user.uid,
'*Вы умерли в туалете!*\n'
'<b>Вы умерли в туалете!</b>\n'
'Мы удалили вашу сессию сранья так как вы слишком долго срете, надеемся вы сейчас живы, и просто забыли завершить сранье, впредь будьте внимательнее.')
except:
...
Expand All @@ -55,11 +57,13 @@ async def end_loop():


async def main():
await brocker.init()

await db.init()

bot = Bot(
token=config.Telegram.token,
parse_mode='markdown',
parse_mode='html',
)
config.bot = bot

Expand Down
5 changes: 3 additions & 2 deletions Dockerfile → bot_service/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ FROM python:3.10-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
COPY ../requirements.txt requirements.txt
RUN pip3 install -r requirements.txt


COPY . .
COPY .. .

WORKDIR /app/bot_service
CMD ["python3.10", "-m", "main"]
2 changes: 2 additions & 0 deletions bot_service/filters/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from .command_mention import CommandMention
from .user import UserAuthFilter
File renamed without changes.
File renamed without changes.
4 changes: 4 additions & 0 deletions handlers/__init__.py → bot_service/handlers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
from . import start
from . import user_properties
from . import report
from . import api
from . import channels

router = Router()

Expand All @@ -18,6 +20,8 @@
router.include_router(info.router)
router.include_router(admin.router)
router.include_router(groups.router)
router.include_router(channels.router)
router.include_router(friends.router)
router.include_router(user_properties.router)
router.include_router(report.router)
router.include_router(api.router)
File renamed without changes.
21 changes: 12 additions & 9 deletions handlers/admin/ban.py → bot_service/handlers/admin/ban.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
from aiogram import Router, F
from aiogram import Router
from aiogram import types
from aiogram.filters import Command, CommandObject
from aiogram.utils.formatting import Text, Bold, Italic, Pre

import config
from db.User import Ban, User
from filters.command_mention import CommandMention
from filters.user import UserAuthFilter
from filters import CommandMention
from filters import UserAuthFilter

router = Router()


@router.message(CommandMention("ban"), UserAuthFilter(admin=True))
async def ban(message: types.Message, command: CommandObject, user: User):
if command.args is None:
await message.reply('Пример:\n`/ban <user_id> <reason>`')
await message.reply('Пример:\n<code>/ban <user_id> <reason></code>')
return

args = command.args.split()
Expand Down Expand Up @@ -43,8 +44,10 @@ async def ban(message: types.Message, command: CommandObject, user: User):
if admin_user is not None:
await message.reply('Админа можно забанить только через базу данных. Сообщаем всем.')

text = (f'❗️ Админ *{user.name}* _({user.uid})_ хочет забанить админа *{admin_user.name}* _({admin_user.uid})_\n'
f'```Причина:\n{reason}```')
text = Text(
f'❗️ Админ ', Bold(user.name), ' ', Italic(user.uid), ' хочет забанить админа ', Bold(admin_user.name), ' ', Italic(admin_user.uid), '\n',
Pre(reason, language='Причина:')
)

async for send_to in User.filter(admin=True):
await config.bot.send_message(send_to.uid, text)
Expand All @@ -55,7 +58,7 @@ async def ban(message: types.Message, command: CommandObject, user: User):
await message.reply(f'Пользователь `{ban_id}` забанен по причине `{reason}`')

try:
text = ('*Вы забанены в боте!* Ваши действия теперь игнорируются и не будут обрабатываться.\n'
text = ('<b>Вы забанены в боте!</b> Ваши действия теперь игнорируются и не будут обрабатываться.\n'
'Если вы считаете, что произошла ошибка обратитесь к администрации.\n'
'https://www.youtube.com/watch?v=XeoS-zsGVCs')
await config.bot.send_message(ban_id, text)
Expand All @@ -67,7 +70,7 @@ async def ban(message: types.Message, command: CommandObject, user: User):
@router.message(Command("unban"), UserAuthFilter(admin=True))
async def unban(message: types.Message, command: CommandObject):
if command.args is None:
await message.reply('Пример:\n`/unban <user_id>`')
await message.reply('Пример:\n<code>/unban <user_id></code>')
return

if not command.args.isnumeric():
Expand All @@ -82,7 +85,7 @@ async def unban(message: types.Message, command: CommandObject):
return

await ban.delete()
await message.reply(f'Пользователь `{ban_id}` разбанен.')
await message.reply(f'Пользователь <code>{ban_id}</code> разбанен.')

try:
await config.bot.send_message(ban_id, 'Вы разбанены в боте.')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,20 @@
from aiogram import Router
from aiogram import types
from aiogram.filters import CommandObject
from aiogram.utils.formatting import Text, Pre, Code
from loguru import logger

import config
from config import ISC
from filters.command_mention import CommandMention
from filters.user import UserAuthFilter
from bot_service.filters import CommandMention
from bot_service.filters import UserAuthFilter
from middlewares.degrade import DegradationData

router = Router()


def render_now_degradations(degrade_model: DegradationData):
rer = degrade_model.__str__().replace(" ", "\n")
return f'```Текущий{ISC}статус{ISC}деградаций\n{rer}```'
return Pre(rer, language='Текущий статус деградаций')


@router.message(CommandMention("degrade"), UserAuthFilter(admin=True))
Expand All @@ -32,12 +32,20 @@ async def degrade(message: types.Message, command: CommandObject):
degrade_model = DegradationData(**degrade_now)

if args[0] not in DegradationData.model_fields:
degradation_keys = [f'`{el}`' for el in DegradationData.model_fields.keys()]
await message.reply(f'Не можем найти деградацию `{args[0]}`\n'
f'Возможные деградации: {", ".join(degradation_keys)}\n\n'
f'{render_now_degradations(degrade_model)}')
degradation_keys = []
for el in DegradationData.model_fields.keys():
degradation_keys.append(Code(el))
degradation_keys.append(', ')
degradation_keys.pop()

text = Text(
f'Не можем найти деградацию ', Code(args[0]), '\n',
f'Возможные деградации: ', *degradation_keys, '\n\n',
render_now_degradations(degrade_model),
)
await message.reply(**text.as_kwargs())
return

await config.storage.redis.set('degrade', json.dumps(degrade_model.model_dump()))

await message.reply(f'Успешно\n{render_now_degradations(degrade_model)}')
await message.reply(**Text('Успешно', render_now_degradations(degrade_model)).as_kwargs())
Loading

0 comments on commit 272baac

Please sign in to comment.