mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-27 13:34:28 +00:00
Add summon command, but it's unfinished
This commit is contained in:
parent
43ce9b09f2
commit
ac2ea55902
8 changed files with 80 additions and 13 deletions
|
@ -1,5 +1,6 @@
|
||||||
import os
|
import os
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import logging
|
||||||
from royalnet.bots import TelegramBot, DiscordBot
|
from royalnet.bots import TelegramBot, DiscordBot
|
||||||
from royalnet.commands import *
|
from royalnet.commands import *
|
||||||
from royalnet.commands.debug_create import DebugCreateCommand
|
from royalnet.commands.debug_create import DebugCreateCommand
|
||||||
|
@ -9,13 +10,23 @@ from royalnet.database.tables import Royal, Telegram, Discord
|
||||||
|
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
|
|
||||||
|
tg_log = logging.getLogger("royalnet.bots.telegram")
|
||||||
|
tg_log.addHandler(logging.StreamHandler())
|
||||||
|
tg_log.setLevel(logging.DEBUG)
|
||||||
|
ds_log = logging.getLogger("royalnet.bots.discord")
|
||||||
|
ds_log.addHandler(logging.StreamHandler())
|
||||||
|
ds_log.setLevel(logging.DEBUG)
|
||||||
|
rygnet_log = logging.getLogger("royalnet.network.server")
|
||||||
|
rygnet_log.addHandler(logging.StreamHandler())
|
||||||
|
rygnet_log.setLevel(logging.DEBUG)
|
||||||
|
|
||||||
commands = [PingCommand, ShipCommand, SmecdsCommand, ColorCommand, CiaoruoziCommand, DebugCreateCommand, SyncCommand,
|
commands = [PingCommand, ShipCommand, SmecdsCommand, ColorCommand, CiaoruoziCommand, DebugCreateCommand, SyncCommand,
|
||||||
AuthorCommand, DiarioCommand, RageCommand, DateparserCommand, ReminderCommand, KvactiveCommand, KvCommand,
|
AuthorCommand, DiarioCommand, RageCommand, DateparserCommand, ReminderCommand, KvactiveCommand, KvCommand,
|
||||||
KvrollCommand, VideoinfoCommand]
|
KvrollCommand, VideoinfoCommand, SummonCommand]
|
||||||
|
|
||||||
master = RoyalnetServer("localhost", 1234, "sas")
|
master = RoyalnetServer("localhost", 1234, "sas")
|
||||||
tg_bot = TelegramBot(os.environ["TG_AK"], "localhost:1234", "sas", commands, os.environ["DB_PATH"], Royal, Telegram, "tg_id", error_command=ErrorHandlerCommand)
|
tg_bot = TelegramBot(os.environ["TG_AK"], "ws://localhost:1234", "sas", commands, os.environ["DB_PATH"], Royal, Telegram, "tg_id", error_command=ErrorHandlerCommand)
|
||||||
ds_bot = DiscordBot(os.environ["DS_AK"], "localhost:1234", "sas", commands, os.environ["DB_PATH"], Royal, Discord, "discord_id", error_command=ErrorHandlerCommand)
|
ds_bot = DiscordBot(os.environ["DS_AK"], "ws://localhost:1234", "sas", commands, os.environ["DB_PATH"], Royal, Discord, "discord_id", error_command=ErrorHandlerCommand)
|
||||||
loop.create_task(master.run())
|
loop.create_task(master.run())
|
||||||
loop.create_task(tg_bot.run())
|
loop.create_task(tg_bot.run())
|
||||||
loop.create_task(ds_bot.run())
|
loop.create_task(ds_bot.run())
|
||||||
|
|
|
@ -4,6 +4,7 @@ import typing
|
||||||
import logging as _logging
|
import logging as _logging
|
||||||
import sys
|
import sys
|
||||||
from ..commands import NullCommand
|
from ..commands import NullCommand
|
||||||
|
from ..commands.summon import SummonMessage, SummonSuccessful, SummonError
|
||||||
from ..utils import asyncify, Call, Command, UnregisteredError
|
from ..utils import asyncify, Call, Command, UnregisteredError
|
||||||
from ..network import RoyalnetLink, Message
|
from ..network import RoyalnetLink, Message
|
||||||
from ..database import Alchemy, relationshiplinkchain
|
from ..database import Alchemy, relationshiplinkchain
|
||||||
|
@ -11,9 +12,9 @@ from ..database import Alchemy, relationshiplinkchain
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
log = _logging.getLogger(__name__)
|
log = _logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# TODO: Load the opus library
|
||||||
async def todo(message: Message):
|
if not discord.opus.is_loaded():
|
||||||
log.warning(f"Skipped {message} because handling isn't supported yet.")
|
log.error("Opus is not loaded. Weird behaviour might emerge.")
|
||||||
|
|
||||||
|
|
||||||
class DiscordBot:
|
class DiscordBot:
|
||||||
|
@ -31,7 +32,6 @@ class DiscordBot:
|
||||||
self.token = token
|
self.token = token
|
||||||
self.missing_command = missing_command
|
self.missing_command = missing_command
|
||||||
self.error_command = error_command
|
self.error_command = error_command
|
||||||
self.network: RoyalnetLink = RoyalnetLink(master_server_uri, master_server_secret, "discord", todo)
|
|
||||||
# Generate commands
|
# Generate commands
|
||||||
self.commands = {}
|
self.commands = {}
|
||||||
required_tables = set()
|
required_tables = set()
|
||||||
|
@ -45,6 +45,25 @@ class DiscordBot:
|
||||||
self.identity_column = self.identity_table.__getattribute__(self.identity_table, identity_column_name)
|
self.identity_column = self.identity_table.__getattribute__(self.identity_table, identity_column_name)
|
||||||
self.identity_chain = relationshiplinkchain(self.master_table, self.identity_table)
|
self.identity_chain = relationshiplinkchain(self.master_table, self.identity_table)
|
||||||
|
|
||||||
|
async def network_handler(message: Message) -> Message:
|
||||||
|
if isinstance(message, SummonMessage):
|
||||||
|
channels: typing.List[discord.abc.GuildChannel] = self.bot.get_all_channels()
|
||||||
|
matching_channels: typing.List[discord.VoiceChannel] = []
|
||||||
|
for channel in channels:
|
||||||
|
if isinstance(channel, discord.VoiceChannel):
|
||||||
|
if channel.name == message.channel_name:
|
||||||
|
matching_channels.append(channel)
|
||||||
|
if len(matching_channels) == 0:
|
||||||
|
return SummonError("No channels with a matching name found")
|
||||||
|
elif len(matching_channels) > 1:
|
||||||
|
return SummonError("Multiple channels with a matching name found")
|
||||||
|
matching_channel = matching_channels[0]
|
||||||
|
await matching_channel.connect()
|
||||||
|
return SummonSuccessful()
|
||||||
|
|
||||||
|
self.network: RoyalnetLink = RoyalnetLink(master_server_uri, master_server_secret, "discord", network_handler)
|
||||||
|
loop.create_task(self.network.run())
|
||||||
|
|
||||||
# noinspection PyMethodParameters
|
# noinspection PyMethodParameters
|
||||||
class DiscordCall(Call):
|
class DiscordCall(Call):
|
||||||
interface_name = "discord"
|
interface_name = "discord"
|
||||||
|
|
|
@ -34,6 +34,7 @@ class TelegramBot:
|
||||||
self.missing_command = missing_command
|
self.missing_command = missing_command
|
||||||
self.error_command = error_command
|
self.error_command = error_command
|
||||||
self.network: RoyalnetLink = RoyalnetLink(master_server_uri, master_server_secret, "telegram", todo)
|
self.network: RoyalnetLink = RoyalnetLink(master_server_uri, master_server_secret, "telegram", todo)
|
||||||
|
loop.create_task(self.network.run())
|
||||||
# Generate commands
|
# Generate commands
|
||||||
self.commands = {}
|
self.commands = {}
|
||||||
required_tables = set()
|
required_tables = set()
|
||||||
|
|
|
@ -14,8 +14,9 @@ from .kvactive import KvactiveCommand
|
||||||
from .kv import KvCommand
|
from .kv import KvCommand
|
||||||
from .kvroll import KvrollCommand
|
from .kvroll import KvrollCommand
|
||||||
from .videoinfo import VideoinfoCommand
|
from .videoinfo import VideoinfoCommand
|
||||||
|
from .summon import SummonCommand
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["NullCommand", "PingCommand", "ShipCommand", "SmecdsCommand", "CiaoruoziCommand", "ColorCommand",
|
__all__ = ["NullCommand", "PingCommand", "ShipCommand", "SmecdsCommand", "CiaoruoziCommand", "ColorCommand",
|
||||||
"SyncCommand", "DiarioCommand", "RageCommand", "DateparserCommand", "AuthorCommand", "ReminderCommand",
|
"SyncCommand", "DiarioCommand", "RageCommand", "DateparserCommand", "AuthorCommand", "ReminderCommand",
|
||||||
"KvactiveCommand", "KvCommand", "KvrollCommand", "VideoinfoCommand"]
|
"KvactiveCommand", "KvCommand", "KvrollCommand", "VideoinfoCommand", "SummonCommand"]
|
||||||
|
|
35
royalnet/commands/summon.py
Normal file
35
royalnet/commands/summon.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import typing
|
||||||
|
from ..utils import Command, Call
|
||||||
|
from ..network import Message, ErrorMessage
|
||||||
|
|
||||||
|
|
||||||
|
class SummonMessage(Message):
|
||||||
|
def __init__(self, channel_name: str):
|
||||||
|
self.channel_name: str = channel_name
|
||||||
|
|
||||||
|
|
||||||
|
class SummonSuccessful(Message):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class SummonError(ErrorMessage):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class SummonCommand(Command):
|
||||||
|
|
||||||
|
command_name = "summon"
|
||||||
|
command_description = "Evoca il bot in un canale vocale."
|
||||||
|
command_syntax = "[channelname]"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
async def common(cls, call: Call):
|
||||||
|
channel_name: str = call.args[0].lstrip("#")
|
||||||
|
response: typing.Union[SummonSuccessful, SummonError] = await call.net_request(SummonMessage(channel_name), "discord")
|
||||||
|
if isinstance(response, SummonError):
|
||||||
|
await call.reply(f"⚠️ Si è verificato un'errore nella richiesta di connessione:\n[c]{response.reason}[/c]")
|
||||||
|
return
|
||||||
|
elif isinstance(response, SummonSuccessful):
|
||||||
|
await call.reply(f"✅ Mi sono connesso in [c]#{channel_name}[/c].")
|
||||||
|
return
|
||||||
|
raise Exception(f"wtf is this: {response}")
|
|
@ -6,8 +6,8 @@ from ..audio import YtdlInfo
|
||||||
class VideoinfoCommand(Command):
|
class VideoinfoCommand(Command):
|
||||||
|
|
||||||
command_name = "videoinfo"
|
command_name = "videoinfo"
|
||||||
command_description = "Scarica e visualizza le informazioni di un video."
|
command_description = "Visualizza le informazioni di un video."
|
||||||
command_syntax = ""
|
command_syntax = "(url)"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def common(cls, call: Call):
|
async def common(cls, call: Call):
|
||||||
|
|
|
@ -52,7 +52,7 @@ def requires_connection(func):
|
||||||
def requires_identification(func):
|
def requires_identification(func):
|
||||||
@functools.wraps(func)
|
@functools.wraps(func)
|
||||||
async def new_func(self, *args, **kwargs):
|
async def new_func(self, *args, **kwargs):
|
||||||
await self._identify_event.wait()
|
await self.identify_event.wait()
|
||||||
return await func(self, *args, **kwargs)
|
return await func(self, *args, **kwargs)
|
||||||
return new_func
|
return new_func
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@ log = _logging.getLogger(__name__)
|
||||||
class ConnectedClient:
|
class ConnectedClient:
|
||||||
def __init__(self, socket: websockets.WebSocketServerProtocol):
|
def __init__(self, socket: websockets.WebSocketServerProtocol):
|
||||||
self.socket: websockets.WebSocketServerProtocol = socket
|
self.socket: websockets.WebSocketServerProtocol = socket
|
||||||
self.nid: str = None
|
self.nid: typing.Optional[str] = None
|
||||||
self.link_type: str = None
|
self.link_type: typing.Optional[str] = None
|
||||||
self.connection_datetime: datetime.datetime = datetime.datetime.now()
|
self.connection_datetime: datetime.datetime = datetime.datetime.now()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
Loading…
Reference in a new issue