mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-27 13:34:28 +00:00
Add dnditem command
This commit is contained in:
parent
1f13904ee9
commit
fcc3bbe111
8 changed files with 93 additions and 8 deletions
|
@ -17,3 +17,4 @@ werkzeug>=0.15.4
|
|||
flask>=1.0.3
|
||||
markdown2>=2.3.8
|
||||
mcstatus>=2.2.1
|
||||
sortedcontainers>=2.1.0
|
||||
|
|
|
@ -20,6 +20,7 @@ from .skip import SkipCommand
|
|||
from .smecds import SmecdsCommand
|
||||
from .summon import SummonCommand
|
||||
from .videochannel import VideochannelCommand
|
||||
from .dnditem import DnditemCommand
|
||||
|
||||
__all__ = [
|
||||
"CiaoruoziCommand",
|
||||
|
@ -38,5 +39,6 @@ __all__ = [
|
|||
"SkipCommand",
|
||||
"SmecdsCommand",
|
||||
"SummonCommand",
|
||||
"VideochannelCommand"
|
||||
"VideochannelCommand",
|
||||
"DnditemCommand"
|
||||
]
|
||||
|
|
72
royalnet/commands/royalgames/dnditem.py
Normal file
72
royalnet/commands/royalgames/dnditem.py
Normal file
|
@ -0,0 +1,72 @@
|
|||
import typing
|
||||
import aiohttp
|
||||
import sortedcontainers
|
||||
from ..command import Command
|
||||
from ..commandargs import CommandArgs
|
||||
from ..commanddata import CommandData
|
||||
from ..commandinterface import CommandInterface
|
||||
|
||||
|
||||
class DnditemCommand(Command):
|
||||
name: str = "dnditem"
|
||||
|
||||
description: str = "Ottieni informazioni su un oggetto di D&D5e."
|
||||
|
||||
syntax = "(nomeoggetto)"
|
||||
|
||||
_dnddata: sortedcontainers.SortedKeyList = None
|
||||
|
||||
def __init__(self, interface: CommandInterface):
|
||||
super().__init__(interface)
|
||||
interface.loop.create_task(self._fetch_dnddata())
|
||||
|
||||
async def _fetch_dnddata(self):
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get("https://scaleway.steffo.eu/dnd/items.json") as response:
|
||||
j = await response.json()
|
||||
self._dnddata = sortedcontainers.SortedKeyList(j["item"], key=lambda i: i["name"].lower())
|
||||
|
||||
def _parse_entry(self, entry):
|
||||
if isinstance(entry, str):
|
||||
return entry
|
||||
elif isinstance(entry, dict):
|
||||
string = ""
|
||||
if entry["type"] == "entries":
|
||||
string += f'[b]{entry.get("name", "")}[/b]\n'
|
||||
for subentry in entry["entries"]:
|
||||
string += self._parse_entry(subentry)
|
||||
elif entry["type"] == "table":
|
||||
string += "[i][table hidden][/i]"
|
||||
# for label in entry["colLabels"]:
|
||||
# string += f"| {label} "
|
||||
# string += "|"
|
||||
# for row in entry["rows"]:
|
||||
# for column in row:
|
||||
# string += f"| {self._parse_entry(column)} "
|
||||
# string += "|\n"
|
||||
elif entry["type"] == "cell":
|
||||
return self._parse_entry(entry["entry"])
|
||||
else:
|
||||
string += "[i][unknown type][/i]"
|
||||
else:
|
||||
return "[/i][unknown data][/i]"
|
||||
return string
|
||||
|
||||
async def run(self, args: CommandArgs, data: CommandData) -> None:
|
||||
if self._dnddata is None:
|
||||
await data.reply("⚠️ Il database degli oggetti di D&D non è ancora stato scaricato.")
|
||||
return
|
||||
search = args.joined().lower()
|
||||
result = self._dnddata[self._dnddata.bisect_key_left(search)]
|
||||
string = f'[b]{result["name"]}[/b]\n' \
|
||||
f'[i]{result["source"]}, page {result["page"]}[/i]\n' \
|
||||
f'\n' \
|
||||
f'Type: [b]{result.get("type", "None")}[/b]\n' \
|
||||
f'Value: [b]{result.get("value", "Priceless")}[/b]\n' \
|
||||
f'Weight: [b]{result.get("weight", "0")} lb[/b]\n' \
|
||||
f'Rarity: [b]{result["rarity"] if result["rarity"] != "None" else "Mundane"}[/b]\n' \
|
||||
f'\n'
|
||||
for entry in result.get("entries", []):
|
||||
string += self._parse_entry(entry)
|
||||
string += "\n\n"
|
||||
await data.reply(string)
|
|
@ -34,9 +34,9 @@ class ReminderCommand(Command):
|
|||
.all()
|
||||
)
|
||||
for reminder in reminders:
|
||||
interface.loop.create_task(self.remind(reminder))
|
||||
interface.loop.create_task(self._remind(reminder))
|
||||
|
||||
async def remind(self, reminder):
|
||||
async def _remind(self, reminder):
|
||||
await sleep_until(reminder.datetime)
|
||||
if self.interface.name == "telegram":
|
||||
chat_id: int = pickle.loads(reminder.interface_data)
|
||||
|
@ -74,6 +74,6 @@ class ReminderCommand(Command):
|
|||
interface_data=interface_data,
|
||||
datetime=date,
|
||||
message=reminder_text)
|
||||
self.interface.loop.create_task(self.remind(reminder))
|
||||
self.interface.loop.create_task(self._remind(reminder))
|
||||
self.interface.session.add(reminder)
|
||||
await asyncify(self.interface.session.commit)
|
||||
|
|
|
@ -33,7 +33,8 @@ commands = [
|
|||
SkipCommand,
|
||||
SmecdsCommand,
|
||||
SummonCommand,
|
||||
VideochannelCommand
|
||||
VideochannelCommand,
|
||||
DnditemCommand
|
||||
]
|
||||
|
||||
# noinspection PyUnreachableCode
|
||||
|
|
|
@ -6,8 +6,8 @@ from .safeformat import safeformat
|
|||
from .classdictjanitor import cdj
|
||||
from .sleepuntil import sleep_until
|
||||
from .networkhandler import NetworkHandler
|
||||
from .formatters import andformat, plusformat, fileformat, ytdldateformat, numberemojiformat
|
||||
from .formatters import andformat, plusformat, fileformat, ytdldateformat, numberemojiformat, splitstring
|
||||
|
||||
__all__ = ["asyncify", "safeformat", "cdj", "sleep_until", "plusformat",
|
||||
"NetworkHandler", "andformat", "plusformat", "fileformat", "ytdldateformat", "numberemojiformat",
|
||||
"telegram_escape", "discord_escape"]
|
||||
"telegram_escape", "discord_escape", "splitstring"]
|
||||
|
|
|
@ -70,3 +70,11 @@ def numberemojiformat(l: typing.List[str]) -> str:
|
|||
except IndexError:
|
||||
result += f"{extra_emoji} {element}\n"
|
||||
return result
|
||||
|
||||
|
||||
def splitstring(s: str, max: int) -> typing.List[str]:
|
||||
l = []
|
||||
while s:
|
||||
l.append(s[:max])
|
||||
s = s[max:]
|
||||
return l
|
||||
|
|
3
setup.py
3
setup.py
|
@ -28,7 +28,8 @@ setuptools.setup(
|
|||
"werkzeug>=0.15.4",
|
||||
"flask>=1.0.3",
|
||||
"markdown2>=2.3.8",
|
||||
"mcstatus>=2.2.1"],
|
||||
"mcstatus>=2.2.1",
|
||||
"sortedcontainers>=2.1.0"],
|
||||
python_requires=">=3.7",
|
||||
classifiers=[
|
||||
"Development Status :: 3 - Alpha",
|
||||
|
|
Loading…
Reference in a new issue