Compare commits
6 Commits
3ad4c2ea3e
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 17a1e4bb36 | |||
| 0faff426a7 | |||
| 970a0e6fd4 | |||
| c13eb62770 | |||
| 0fa538d079 | |||
| fed548e9e8 |
@@ -5,5 +5,6 @@ POSTGRES_PASSWORD=postgres
|
||||
POSTGRES_DB=postgres
|
||||
POSTGRES_HOST=postgres
|
||||
POSTGRES_PORT=5432
|
||||
DOMAIN_NAME=localhost
|
||||
|
||||
COMPOSE_PROJECT_NAME=nwxraybot
|
||||
@@ -1,6 +1,5 @@
|
||||
when:
|
||||
- branch: [master, deploy]
|
||||
event: [push, manual]
|
||||
steps:
|
||||
- name: build
|
||||
image: docker:latest
|
||||
@@ -24,6 +23,7 @@ steps:
|
||||
environment:
|
||||
ENV_FILE:
|
||||
from_secret: ENV_FILE
|
||||
depends_on: [build]
|
||||
depends_on: build
|
||||
when:
|
||||
- branch: deploy
|
||||
- event: manual
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
ports:
|
||||
- "127.0.0.1:${POSTGRES_PORT}:5432"
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready"]
|
||||
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from nwxraybot.bot import NwXrayBot
|
||||
from nwxraybot.config import Settings
|
||||
from nwxraybot.utils import get_code, get_subscription_info
|
||||
from nwxraybot.utils import (get_code, get_correct_user_url,
|
||||
get_subscription_info)
|
||||
|
||||
@@ -10,6 +10,7 @@ class Settings(BaseSettings):
|
||||
postgres_db: str = Field('db', env="POSTGRES_DB")
|
||||
postgres_host: str = Field('localhost', env="POSTGRES_HOST")
|
||||
postgres_port: int = Field(5432, env="POSTGRES_PORT")
|
||||
domain_name: str = Field('localhost', env="DOMAIN_NAME")
|
||||
|
||||
@property
|
||||
def postgres_url(self) -> str:
|
||||
|
||||
@@ -16,6 +16,7 @@ from nwxraybot.fsm import BroadcastStates
|
||||
from nwxraybot.meta import Handler
|
||||
from nwxraybot.middlewares import AdminMiddleware
|
||||
from nwxraybot.models import User
|
||||
from nwxraybot.utils import get_correct_user_url
|
||||
|
||||
|
||||
class AdminHandler(Handler):
|
||||
@@ -24,6 +25,17 @@ class AdminHandler(Handler):
|
||||
|
||||
self.router.message.middleware(AdminMiddleware())
|
||||
|
||||
help_text = """Список команда администратора:
|
||||
`/adduser name url [01.01.1970 00:00]` - добавить пользователя
|
||||
`/updateuser name 01.01.1970 00:00` - обновить информацию о пользователе
|
||||
`/broadcast` - рассылка (пошагово)
|
||||
`/get_users` - список пользователей
|
||||
"""
|
||||
|
||||
@self.router.message(Command('ahelp'))
|
||||
async def help(message: Message):
|
||||
await message.reply(help_text, parse_mode=ParseMode.MARKDOWN)
|
||||
|
||||
@self.router.message(Command('adduser'))
|
||||
async def add_user(message: Message):
|
||||
mask = r"^(?P<name>[a-zA-Z0-9]+)\s(?P<url>vless://[^\s]+)($|\s(?P<date>[0-9]{2}\.[0-9]{2}\.[0-9]{4})\s(?P<time>[0-9]{2}\:[0-9]{2})$)"
|
||||
@@ -33,13 +45,15 @@ class AdminHandler(Handler):
|
||||
await message.reply('Вы ввели команду в неверном формате. Вводите в формате:\n``` /adduser name vless://.... 01.01.1970 00:00```', parse_mode=ParseMode.MARKDOWN)
|
||||
return
|
||||
user_dict = match.groupdict()
|
||||
url = user_dict['url']
|
||||
url = get_correct_user_url(url)
|
||||
date = None
|
||||
if user_dict['date']:
|
||||
date = datetime.strptime(f"{user_dict['date']} {
|
||||
user_dict['time']}", "%d.%m.%Y %H:%M")
|
||||
code = get_code()
|
||||
new_user = User(
|
||||
name=user_dict['name'], url=user_dict['url'], time=date, code=code)
|
||||
name=user_dict['name'], url=url, time=date, code=code)
|
||||
new_user.save()
|
||||
await message.answer(f'Пользователь создан. Вот его ссылка для доступа:\n`https://t.me/nwproxybot?start={code}`', parse_mode=ParseMode.MARKDOWN)
|
||||
|
||||
@@ -59,6 +73,24 @@ class AdminHandler(Handler):
|
||||
query.execute()
|
||||
await message.answer('Информация о пользователе обновлена.')
|
||||
|
||||
@self.router.message(Command('get_users'))
|
||||
async def get_users(message: Message):
|
||||
def get_user_info(user: User) -> str:
|
||||
date_str = "" if user.time is None else f'До: {
|
||||
user.time.strftime("%d.%m.%Y %H:%M")} МСК\n'
|
||||
return f"Информация о пользователе `{user.name}`:\n{date_str}Ссылка: `{user.url}`\ncode: `{user.code if user.code else 'None'}`\n\n"
|
||||
|
||||
users = User.select()
|
||||
res = ""
|
||||
for user in users:
|
||||
res += get_user_info(user)
|
||||
try:
|
||||
await message.answer(res, parse_mode=ParseMode.MARKDOWN)
|
||||
except Exception as e:
|
||||
await message.answer(f"Error while getting users: {e}")
|
||||
logging.error(f"Error while getting user {
|
||||
user.telegram_id}: {e}")
|
||||
|
||||
@self.router.message(Command('broadcast'))
|
||||
async def start_broadcast(message: Message, state: FSMContext):
|
||||
await message.answer('Отправьте для рассылки')
|
||||
|
||||
@@ -2,9 +2,13 @@ import logging
|
||||
from datetime import datetime
|
||||
from secrets import token_urlsafe
|
||||
from typing import Optional
|
||||
from urllib.parse import parse_qs, urlencode, urlparse, urlunparse
|
||||
|
||||
from nwxraybot import Settings
|
||||
from nwxraybot.models import User
|
||||
|
||||
config = Settings()
|
||||
|
||||
|
||||
def get_subscription_info(telegram_id: str) -> str:
|
||||
user: User = User.select().where(User.telegram_id == telegram_id).first()
|
||||
@@ -20,3 +24,16 @@ def get_subscription_info(telegram_id: str) -> str:
|
||||
|
||||
def get_code(length: int = 10) -> str:
|
||||
return token_urlsafe(length)[:length]
|
||||
|
||||
|
||||
def get_correct_user_url(url: str) -> str:
|
||||
parsed_url = urlparse(url)
|
||||
query = parse_qs(parsed_url.query)
|
||||
query['fp'] = 'chrome'
|
||||
query['alpn'] = 'h2,h3'
|
||||
query['packetEncoding'] = 'xudp'
|
||||
query['security'] = 'tls'
|
||||
new_query = urlencode(query, doseq=True)
|
||||
new_url = urlunparse((parsed_url.scheme, parsed_url.netloc.replace("127.0.0.1:1234", f"{
|
||||
config.domain_name}:443"), parsed_url.path, parsed_url.params, new_query, parsed_url.fragment))
|
||||
return new_url
|
||||
|
||||
Reference in New Issue
Block a user