from pathlib import Path
from sys import argv
script_dir = Path(argv[0]).parent.resolve() # путь к каталогу скрипта
db_path = script_dir / 'basa' / 'users.db' # путь к файлу в подкаталоге
async def role(ctx, target: discord.Member):
import functools
def loginrequired(f):
@functools.wraps(f) # замаскирует wrapper() под f()
def wrapper (*args, **kwargs):
pass# бла-бла-бла
return f(*args, **kwargs)
return wrapper
Логи!A:F
, и перебирать его строки. Тогда и индекс считать не потребуется, у тебя в текущей строке будет информация по одному и тому же юзеру. Проверяешь нулевой элемент строки на нужное имя, если совпало - вытаскиваешь из последующих элементов нужную информацию. Why does on_message make my commands stop working?
Overriding the default provided on_message forbids any extra commands from running. To fix this, add a bot.process_commands(message) line at the end of your on_message.
await bot.send_message(...)
.async def bot_startup(dp: Dispatcher):
asyncio.create_task(background_func())
.import sdelaj_mne_kruto
не прокатит. data = message.text.strip()
cur.execute(f"INSERT INTO {tableName} ({column_name}) VALUES ('{data}')")
label1.update_idletasks()
после изменения текста, чтобы попросить tkinter перерисовать окно немедленно. class Person:
def __init__(self, name: str):
self._name: str = ''
self.name = name
@property
def name(self) -> str:
return self._name
@name.setter
def name(self, value: str) -> None:
if not value:
raise ValueError('Must not be empty')
self._name = value
from typing import TypeVar, Type, Any, Annotated, Callable, Dict, get_args, get_origin
T = TypeVar('T')
ValidationRule = Callable[[Any], bool]
ValidationRules = Dict[str, ValidationRule]
class ValidatedProperty:
"""Экземпляры этого класса будут свойствами в валидируемых классах, и будут заниматься валидацией."""
def __init__(self, name: str, storagename: str, rules: ValidationRules):
self.name = name # как называется свойство
self.storagename = storagename # где его хранить
self.rules = rules # какие правила применять
def __get__(self, instance, owner=None):
return getattr(instance, self.storagename) # при чтении просто возвращаем свойство
def __set__(self, instance, value): # при записи валидируем
for message, rule in self.rules.items():
if not rule(value): # если правило нарушено, выкидываем исключение с сообщением
raise ValueError(f'{instance.__class__.__name__}.{self.name}: {message}')
setattr(instance, self.storagename, value)
def validated(klass: Type[T]) -> Type[T]:
"""Декоратор для валидируемых классов."""
for name, annot in klass.__annotations__.items(): # проверяем список аннотаций в классе
base = get_origin(annot) or annot
if base is not Annotated: # нас интересуют только те, которые помечены как Annotated
continue
args = get_args(annot)
rules = [arg for arg in args if isinstance(arg, dict)]
if not rules: # и только если один (любой) из аргументов Annotated - словарь
continue
# в этом случае мы считаем, что словарь содержит правила валидации, и создаём свойство класса
setattr(klass, name, ValidatedProperty(name, f'_{name}', rules[0]))
return klass # не забываем вернуть изменённый класс!
@validated
class Person:
name: Annotated[str, {'must not be empty': lambda v: bool(v)}]
age: Annotated[int, {'must be positive': lambda v: v > 0}]
def __init__(self, name: str, age: int):
self.name = name # валидация отработает уже здесь
self.age = age # валидация отработает уже здесь
def __repr__(self) -> str:
return f'Person(name={self.name!r}, age={self.age!r})'
try:
Person('John Doe', 23) # отработает успешно
except Exception as err:
print('Failed to create person 1')
print(f'{err.__class__.__name__}: {err!s}')
else:
print('Person 1 created')
try:
Person('', 23) # выкинет исключение
except Exception as err:
print('Failed to create person 2')
print(f'{err.__class__.__name__}: {err!s}')
else:
print('Person 2 created')
try:
Person('Jane Doe', -23) # выкинет исключение
except Exception as err:
print('Failed to create person 3')
print(f'{err.__class__.__name__}: {err!s}')
else:
print('Person 3 created')
p = Person('John Doe', 23)
try:
p.name = '' # выкинет исключение
except Exception as err:
print('Failed to modify person')
print(f'{err.__class__.__name__}: {err!s}')
try:
p.age = 0 # выкинет исключение
except Exception as err:
print('Failed to modify person')
print(f'{err.__class__.__name__}: {err!s}')
try:
p.age = 24 # отработает успешно
except Exception as err:
print('Failed to modify person')
print(f'{err.__class__.__name__}: {err!s}')
print(p)
print(vars(p))
await iface.call_method('bla')
. Ты уверен, что обновление свойства произойдёт после завершения await? Если оно произойдёт до, то твой вызов wait_property() не увидит обновлений. Возможно, стоит вешать callback до вызова call_method()? Ранее для личных целей с личного телефона пользовался данным сервисом - проблем не было (так что вряд ли сам сервис занимается воровством).
# discord.py попытается сначала интерпретировать первый аргумент как пользователя.
# Если не получится - будет просто строка
async def nick(ctx, arg1: typing.Union[discord.Member, str], *, arg2: str = None):
if ctx.message.reference is not None and isintance(arg1, str): # сообщение - это ответ
member = ctx.message.reference.resolved.author
# arg1 будет содержать первое слово ника - доклеиваем к нему остальные.
newnick = f'{arg1} {arg2}' if arg2 is not None else arg1
elif ctx.message.reference is None and isintance(arg1, discord.Member) and arg2 is not None: # сообщение - не ответ
member, newnick = arg1, arg2
else:
... # выводим сообщение о неправильном использовании команды
await member.edit(nick = newnick)