mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-26 21:14:19 +00:00
💥 Login and many other things!
This commit is contained in:
parent
80e9b92e83
commit
80cf8fc83d
18 changed files with 169 additions and 16 deletions
8
poetry.lock
generated
8
poetry.lock
generated
|
@ -303,7 +303,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "royalnet"
|
name = "royalnet"
|
||||||
version = "6.5.0"
|
version = "6.5.4"
|
||||||
description = "A multipurpose bot framework"
|
description = "A multipurpose bot framework"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
|
@ -512,7 +512,7 @@ multidict = ">=4.0"
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.8"
|
python-versions = "^3.8"
|
||||||
content-hash = "d09a25572708f3d976eec40c086da014232918d5d1cd689866c831bc324b598d"
|
content-hash = "c30fdf09f35a2430d64998b966b2648d1bed68a9a1e58e45339f5a1a53895263"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
aiohttp = [
|
aiohttp = [
|
||||||
|
@ -894,8 +894,8 @@ requests = [
|
||||||
{file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
|
{file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
|
||||||
]
|
]
|
||||||
royalnet = [
|
royalnet = [
|
||||||
{file = "royalnet-6.5.0-py3-none-any.whl", hash = "sha256:1c1f0ddb4891d1951bd8fe2e9a4139cc5b3a039d9b2318c0cabd489dc2253ee3"},
|
{file = "royalnet-6.5.4-py3-none-any.whl", hash = "sha256:68d30fdd00653a5e79eab2b22a8c5bb16103e08e8674ec8f4b13ff1bdf1d33d2"},
|
||||||
{file = "royalnet-6.5.0.tar.gz", hash = "sha256:dc4e5a284e8e2f36f259b5fe88e36a5947984c78600fd22e695e62277c787951"},
|
{file = "royalnet-6.5.4.tar.gz", hash = "sha256:fbab17b911c2ee200c0f7bfd5d2bcc4d1d3f9771b41ab64a848a08cdd464e3d8"},
|
||||||
]
|
]
|
||||||
royalnet-console = [
|
royalnet-console = [
|
||||||
{file = "royalnet-console-2.0.4.tar.gz", hash = "sha256:049948a558a2ee7359f808cf61faef08789ce9e3969a0dfb94e65bd912ffcffc"},
|
{file = "royalnet-console-2.0.4.tar.gz", hash = "sha256:049948a558a2ee7359f808cf61faef08789ce9e3969a0dfb94e65bd912ffcffc"},
|
||||||
|
|
|
@ -19,7 +19,7 @@ python = "^3.8"
|
||||||
coloredlogs = "^15.0"
|
coloredlogs = "^15.0"
|
||||||
aiohttp = "^3.7.4"
|
aiohttp = "^3.7.4"
|
||||||
psycopg2 = "^2.8.6"
|
psycopg2 = "^2.8.6"
|
||||||
royalnet = "~6.5.0"
|
royalnet = "~6.5.3"
|
||||||
royalnet_telethon = "^2.0.0"
|
royalnet_telethon = "^2.0.0"
|
||||||
royalnet_console = "^2.0.4"
|
royalnet_console = "^2.0.4"
|
||||||
alembic = "^1.5.8"
|
alembic = "^1.5.8"
|
||||||
|
|
|
@ -55,6 +55,7 @@ register_telegram(commands.pmots, ["pmots"])
|
||||||
register_telegram(commands.spell, ["spell"], "(?P<spellname>.+)")
|
register_telegram(commands.spell, ["spell"], "(?P<spellname>.+)")
|
||||||
register_telegram(commands.smecds, ["smecds"])
|
register_telegram(commands.smecds, ["smecds"])
|
||||||
register_telegram(commands.man, ["man", "help"], "(?P<commandname>[A-Za-z]+)")
|
register_telegram(commands.man, ["man", "help"], "(?P<commandname>[A-Za-z]+)")
|
||||||
|
register_telegram(commands.login, ["login"])
|
||||||
|
|
||||||
|
|
||||||
pda.implementations["telethon.1"].register_conversation(r)
|
pda.implementations["telethon.1"].register_conversation(r)
|
||||||
|
|
|
@ -12,3 +12,4 @@ from .pmots import *
|
||||||
from .spell import *
|
from .spell import *
|
||||||
from .smecds import *
|
from .smecds import *
|
||||||
from .man import *
|
from .man import *
|
||||||
|
from .login import *
|
||||||
|
|
|
@ -2,7 +2,7 @@ import royalnet.engineer as engi
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def ahnonlosoio(*, _sentry: engi.Sentry, _msg: engi.Message, **__):
|
async def ahnonlosoio(*, _msg: engi.Message, **__):
|
||||||
"""
|
"""
|
||||||
Ah, non lo so io!
|
Ah, non lo so io!
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -74,7 +74,7 @@ ANSWERS = [
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def answer(*, _sentry: engi.Sentry, _msg: engi.Message, **__):
|
async def answer(*, _msg: engi.Message, **__):
|
||||||
"""
|
"""
|
||||||
Fai una domanda al bot, che possa essere risposta con un sì o un no: lui ti risponderà!
|
Fai una domanda al bot, che possa essere risposta con un sì o un no: lui ti risponderà!
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -8,7 +8,7 @@ log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def cat(*, _sentry: engi.Sentry, _msg: engi.Message, **__):
|
async def cat(*, _msg: engi.Message, **__):
|
||||||
"""
|
"""
|
||||||
Invia un gatto in chat! 🐈
|
Invia un gatto in chat! 🐈
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -5,7 +5,7 @@ import royalnet_telethon.bullet.contents
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def ciaoruozi(*, _sentry: engi.Sentry, _msg: engi.Message, _imp, **__):
|
async def ciaoruozi(*, _msg: engi.Message, _imp, **__):
|
||||||
"""
|
"""
|
||||||
Saluta Ruozi, una creatura leggendaria che potrebbe esistere o non esistere in Royal Games.
|
Saluta Ruozi, una creatura leggendaria che potrebbe esistere o non esistere in Royal Games.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -3,7 +3,7 @@ import royalnet.engineer.conversation as c
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def color(*, _sentry: engi.Sentry, _msg: engi.Message, **__):
|
async def color(*, _msg: engi.Message, **__):
|
||||||
"""
|
"""
|
||||||
Invia un colore in chat...?
|
Invia un colore in chat...?
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -80,7 +80,7 @@ _emojis = {
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def emojify(*, _msg: engi.Message, message: str, **__):
|
async def emojify(*, message: str, **__):
|
||||||
"""
|
"""
|
||||||
Converti un messaggio in emoji.
|
Converti un messaggio in emoji.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -56,7 +56,7 @@ _fortunes = [
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def fortune(*, _sentry: engi.Sentry, _msg: engi.Message, **__):
|
async def fortune(*, _msg: engi.Message, **__):
|
||||||
"""
|
"""
|
||||||
Come sarà la giornata di oggi?
|
Come sarà la giornata di oggi?
|
||||||
"""
|
"""
|
||||||
|
|
142
royalpack/commands/login.py
Normal file
142
royalpack/commands/login.py
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
import royalnet.engineer as engi
|
||||||
|
import sqlalchemy.sql as ss
|
||||||
|
import sqlalchemy.orm as so
|
||||||
|
import royalpack.database as db
|
||||||
|
import royalpack.config as cfg
|
||||||
|
import royalnet_telethon
|
||||||
|
import royalnet_telethon.bullet.contents
|
||||||
|
import aiohttp
|
||||||
|
import asyncio
|
||||||
|
import logging
|
||||||
|
import arrow
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# FIXME: Properly handle errors in this function!
|
||||||
|
|
||||||
|
@engi.use_database(db.lazy_session_class)
|
||||||
|
@engi.TeleportingConversation
|
||||||
|
async def login(*, _msg: engi.Message, _session: so.Session, _imp, **__):
|
||||||
|
"""
|
||||||
|
Fai il login al tuo account Royalnet.
|
||||||
|
"""
|
||||||
|
log.debug("Evaluating config...")
|
||||||
|
config = cfg.lazy_config.evaluate()
|
||||||
|
|
||||||
|
log.debug("Sliding into DMs...")
|
||||||
|
sender: engi.User = await _msg.sender
|
||||||
|
current: engi.Channel = await _msg.channel
|
||||||
|
private: engi.Channel = await sender.slide()
|
||||||
|
if hash(current) != hash(private):
|
||||||
|
await _msg.reply(text="👤 Ti ho inviato un messaggio in chat privata contenente le istruzioni per il login!")
|
||||||
|
|
||||||
|
async with aiohttp.ClientSession() as http_session:
|
||||||
|
|
||||||
|
log.debug("Generating device code...")
|
||||||
|
async with http_session.post(config["auth.url.device"], data={
|
||||||
|
"client_id": config["auth.client.id"],
|
||||||
|
"scope": "profile email openid",
|
||||||
|
"prompt": "consent",
|
||||||
|
}) as request:
|
||||||
|
response = await request.json()
|
||||||
|
start = arrow.now()
|
||||||
|
|
||||||
|
log.debug("Asking user to login...")
|
||||||
|
await private.send_message(
|
||||||
|
text=f"🌍 Effettua il RYGlogin al seguente URL, poi premi Confirm:\n"
|
||||||
|
f"{response['verification_uri_complete']}\n"
|
||||||
|
f"\n"
|
||||||
|
f"(Codice: {response['user_code']})"
|
||||||
|
)
|
||||||
|
|
||||||
|
expiration = start + datetime.timedelta(seconds=response["expires_in"])
|
||||||
|
while arrow.now() < expiration:
|
||||||
|
log.debug("Sleeping for 10 seconds...")
|
||||||
|
await asyncio.sleep(10)
|
||||||
|
|
||||||
|
async with http_session.post(config["auth.url.token"], data={
|
||||||
|
"client_id": config["auth.client.id"],
|
||||||
|
"grant_type": "urn:ietf:params:oauth:grant-type:device_code",
|
||||||
|
"device_code": response["device_code"],
|
||||||
|
}) as request:
|
||||||
|
response = await request.json()
|
||||||
|
if "error" in response:
|
||||||
|
log.debug(f"Response returned error {response['error']!r}, retrying...")
|
||||||
|
continue
|
||||||
|
elif "access_token" in response:
|
||||||
|
log.debug(f"Obtained access token...")
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
log.error(f"Didn't get an access token, but didn't get an error either?!")
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
log.debug("Login request expired.")
|
||||||
|
await private.send_message(text="🕒 La tua richiesta di login è scaduta. "
|
||||||
|
"Riinvia il comando per ricominciare!")
|
||||||
|
return
|
||||||
|
|
||||||
|
async with http_session.post(config["auth.url.userinfo"], headers={
|
||||||
|
"Authorization": f"{response['token_type']} {response['access_token']}"
|
||||||
|
}) as request:
|
||||||
|
response = await request.json()
|
||||||
|
|
||||||
|
log.debug("Checking if the user already exists...")
|
||||||
|
user: db.User = _session.execute(
|
||||||
|
ss.select(db.User).where(db.User.sub == response["sub"])
|
||||||
|
).scalar()
|
||||||
|
|
||||||
|
log.debug("Creating user dict...")
|
||||||
|
user_dict = {
|
||||||
|
"sub": response['sub'],
|
||||||
|
"last_update": arrow.now(),
|
||||||
|
"name": response['name'],
|
||||||
|
"nickname": response['nickname'],
|
||||||
|
"avatar": response['picture'],
|
||||||
|
"email": response['email'],
|
||||||
|
}
|
||||||
|
|
||||||
|
if user is None:
|
||||||
|
log.info(f"Creating new user: {response['sub']}")
|
||||||
|
user = db.User(**user_dict)
|
||||||
|
_session.add(user)
|
||||||
|
else:
|
||||||
|
log.debug(f"Updating existing user: {response['sub']}")
|
||||||
|
user.update(**user_dict)
|
||||||
|
|
||||||
|
if isinstance(_imp, royalnet_telethon.TelethonPDAImplementation):
|
||||||
|
log.debug("Found out I'm running on Telethon...")
|
||||||
|
|
||||||
|
sender: royalnet_telethon.bullet.contents.TelegramUser
|
||||||
|
|
||||||
|
log.debug("Checking if the TelegramAccount already exists...")
|
||||||
|
tg: db.TelegramAccount = _session.execute(
|
||||||
|
ss.select(db.TelegramAccount).where(db.TelegramAccount.id == sender._user.id)
|
||||||
|
).scalar()
|
||||||
|
|
||||||
|
log.debug("Creating tg_dict...")
|
||||||
|
tg_dict = {
|
||||||
|
"user_fk": response["sub"],
|
||||||
|
"id": sender._user.id,
|
||||||
|
"first_name": sender._user.first_name,
|
||||||
|
"last_name": sender._user.last_name,
|
||||||
|
"username": sender._user.username,
|
||||||
|
"avatar_url": None, # TODO: avatars
|
||||||
|
}
|
||||||
|
|
||||||
|
if tg is None:
|
||||||
|
log.info(f"Creating new TelegramAccount: {sender._user.id}")
|
||||||
|
tg = db.TelegramAccount(**tg_dict)
|
||||||
|
_session.add(tg)
|
||||||
|
else:
|
||||||
|
log.debug(f"Updating existing TelegramAccount: {sender._user.id}")
|
||||||
|
tg.update(**tg_dict)
|
||||||
|
|
||||||
|
log.debug(f"Committing session...")
|
||||||
|
_session.commit()
|
||||||
|
|
||||||
|
log.debug(f"Done, notifying the user...")
|
||||||
|
await private.send_message(text=f"✅ Login riuscito! Sei loggato come {response['name']}!")
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ("login",)
|
|
@ -2,7 +2,7 @@ import royalnet.engineer as engi
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def ping(*, _sentry: engi.Sentry, _msg: engi.Message, **__):
|
async def ping(*, _msg: engi.Message, **__):
|
||||||
"""
|
"""
|
||||||
Gioca a ping pong con il bot. 🏓
|
Gioca a ping pong con il bot. 🏓
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -2,7 +2,7 @@ import royalnet.engineer as engi
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def pmots(*, _sentry: engi.Sentry, _msg: engi.Message, **__):
|
async def pmots(*, _msg: engi.Message, **__):
|
||||||
"""
|
"""
|
||||||
Riprenditi da uno stomp colossale!
|
Riprenditi da uno stomp colossale!
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def ship(*, _sentry: engi.Sentry, _msg: engi.Message, first: str, second: str, **__):
|
async def ship(*, _msg: engi.Message, first: str, second: str, **__):
|
||||||
"""
|
"""
|
||||||
Shippa insieme due persone! 💞
|
Shippa insieme due persone! 💞
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -55,7 +55,7 @@ _ds_list = ["della secca", "del seccatore", "del secchiello", "del secchio", "de
|
||||||
|
|
||||||
|
|
||||||
@engi.TeleportingConversation
|
@engi.TeleportingConversation
|
||||||
async def smecds(*, _sentry: engi.Sentry, _msg: engi.Message, **__):
|
async def smecds(*, _msg: engi.Message, **__):
|
||||||
"""
|
"""
|
||||||
Secondo me, è colpa dello stagista...
|
Secondo me, è colpa dello stagista...
|
||||||
"""
|
"""
|
||||||
|
|
2
royalpack/database/__init__.py
Normal file
2
royalpack/database/__init__.py
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
from .base import *
|
||||||
|
from .engine import *
|
|
@ -9,6 +9,13 @@ lazy_engine = royalnet.lazy.Lazy(lambda c: sqlalchemy.create_engine(c["database.
|
||||||
The uninitialized sqlalchemy engine.
|
The uninitialized sqlalchemy engine.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
lazy_session_class = royalnet.lazy.Lazy(lambda e: sqlalchemy.orm.sessionmaker(bind=e), e=lazy_engine)
|
||||||
|
"""
|
||||||
|
The uninitialized sqlalchemy session class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
"lazy_engine",
|
"lazy_engine",
|
||||||
|
"lazy_session_class",
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue