mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-23 19:44:20 +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
|
flask>=1.0.3
|
||||||
markdown2>=2.3.8
|
markdown2>=2.3.8
|
||||||
mcstatus>=2.2.1
|
mcstatus>=2.2.1
|
||||||
|
sortedcontainers>=2.1.0
|
||||||
|
|
|
@ -20,6 +20,7 @@ from .skip import SkipCommand
|
||||||
from .smecds import SmecdsCommand
|
from .smecds import SmecdsCommand
|
||||||
from .summon import SummonCommand
|
from .summon import SummonCommand
|
||||||
from .videochannel import VideochannelCommand
|
from .videochannel import VideochannelCommand
|
||||||
|
from .dnditem import DnditemCommand
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"CiaoruoziCommand",
|
"CiaoruoziCommand",
|
||||||
|
@ -38,5 +39,6 @@ __all__ = [
|
||||||
"SkipCommand",
|
"SkipCommand",
|
||||||
"SmecdsCommand",
|
"SmecdsCommand",
|
||||||
"SummonCommand",
|
"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()
|
.all()
|
||||||
)
|
)
|
||||||
for reminder in reminders:
|
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)
|
await sleep_until(reminder.datetime)
|
||||||
if self.interface.name == "telegram":
|
if self.interface.name == "telegram":
|
||||||
chat_id: int = pickle.loads(reminder.interface_data)
|
chat_id: int = pickle.loads(reminder.interface_data)
|
||||||
|
@ -74,6 +74,6 @@ class ReminderCommand(Command):
|
||||||
interface_data=interface_data,
|
interface_data=interface_data,
|
||||||
datetime=date,
|
datetime=date,
|
||||||
message=reminder_text)
|
message=reminder_text)
|
||||||
self.interface.loop.create_task(self.remind(reminder))
|
self.interface.loop.create_task(self._remind(reminder))
|
||||||
self.interface.session.add(reminder)
|
self.interface.session.add(reminder)
|
||||||
await asyncify(self.interface.session.commit)
|
await asyncify(self.interface.session.commit)
|
||||||
|
|
|
@ -33,7 +33,8 @@ commands = [
|
||||||
SkipCommand,
|
SkipCommand,
|
||||||
SmecdsCommand,
|
SmecdsCommand,
|
||||||
SummonCommand,
|
SummonCommand,
|
||||||
VideochannelCommand
|
VideochannelCommand,
|
||||||
|
DnditemCommand
|
||||||
]
|
]
|
||||||
|
|
||||||
# noinspection PyUnreachableCode
|
# noinspection PyUnreachableCode
|
||||||
|
|
|
@ -6,8 +6,8 @@ from .safeformat import safeformat
|
||||||
from .classdictjanitor import cdj
|
from .classdictjanitor import cdj
|
||||||
from .sleepuntil import sleep_until
|
from .sleepuntil import sleep_until
|
||||||
from .networkhandler import NetworkHandler
|
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",
|
__all__ = ["asyncify", "safeformat", "cdj", "sleep_until", "plusformat",
|
||||||
"NetworkHandler", "andformat", "plusformat", "fileformat", "ytdldateformat", "numberemojiformat",
|
"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:
|
except IndexError:
|
||||||
result += f"{extra_emoji} {element}\n"
|
result += f"{extra_emoji} {element}\n"
|
||||||
return result
|
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",
|
"werkzeug>=0.15.4",
|
||||||
"flask>=1.0.3",
|
"flask>=1.0.3",
|
||||||
"markdown2>=2.3.8",
|
"markdown2>=2.3.8",
|
||||||
"mcstatus>=2.2.1"],
|
"mcstatus>=2.2.1",
|
||||||
|
"sortedcontainers>=2.1.0"],
|
||||||
python_requires=">=3.7",
|
python_requires=">=3.7",
|
||||||
classifiers=[
|
classifiers=[
|
||||||
"Development Status :: 3 - Alpha",
|
"Development Status :: 3 - Alpha",
|
||||||
|
|
Loading…
Reference in a new issue