From b1fec3d5c18c5714fd4d3400f47478244040c58b Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Fri, 29 Nov 2019 15:55:52 +0100 Subject: [PATCH] More commands done --- poetry.lock | 99 +++++++++++++++++++----- pyproject.toml | 2 + royalpack/commands/__init__.py | 20 ++--- royalpack/commands/cv.py | 22 +++++- royalpack/commands/diario.py | 4 +- royalpack/commands/leagueoflegends.py | 42 +++++----- royalpack/commands/rage.py | 4 +- royalpack/commands/reminder.py | 28 +++---- royalpack/commands/ship.py | 7 +- royalpack/commands/smecds.py | 107 +++++++++++++------------- royalpack/events/discord_cv.py | 5 +- royalpack/utils/leagueleague.py | 18 +++++ 12 files changed, 219 insertions(+), 139 deletions(-) diff --git a/poetry.lock b/poetry.lock index 401273c1..02380619 100644 --- a/poetry.lock +++ b/poetry.lock @@ -44,7 +44,7 @@ description = "Python package for providing Mozilla's CA Bundle." name = "certifi" optional = false python-versions = "*" -version = "2019.9.11" +version = "2019.11.28" [[package]] category = "main" @@ -302,6 +302,38 @@ optional = false python-versions = "*" version = "2019.11.1" +[[package]] +category = "main" +description = "Python HTTP for Humans." +name = "requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.22.0" + +[package.dependencies] +certifi = ">=2017.4.17" +chardet = ">=3.0.2,<3.1.0" +idna = ">=2.5,<2.9" +urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" + +[package.extras] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"] +socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] + +[[package]] +category = "main" +description = "RiotWatcher is a thin wrapper on top of the Riot Games API for League of Legends." +name = "riotwatcher" +optional = false +python-versions = "*" +version = "2.7.1" + +[package.dependencies] +requests = "*" + +[package.extras] +dev = ["coverage", "pre-commit", "pytest", "pytest-cov", "tox"] + [[package]] category = "main" description = "" @@ -374,7 +406,7 @@ sentry = ["sentry_sdk (~0.13.2)"] telegram = ["python_telegram_bot (^12.2.0)"] [package.source] -reference = "c4bc1811825d7b2609f587a4890ddb5b8a618cf6" +reference = "491301b6811a41bd02192209ae75de861332aca4" type = "git" url = "https://github.com/Steffo99/royalnet/" @@ -520,8 +552,8 @@ category = "main" description = "Yet another URL library" name = "yarl" optional = false -python-versions = ">=3.5.3" -version = "1.3.0" +python-versions = ">=3.5" +version = "1.4.1" [package.dependencies] idna = ">=2.0" @@ -533,10 +565,10 @@ description = "YouTube video downloader" name = "youtube-dl" optional = false python-versions = "*" -version = "2019.11.22" +version = "2019.11.28" [metadata] -content-hash = "e358039cf58db05d50f73138e8b431bcbe8476bc60181233645f2064ee496023" +content-hash = "869279b7212d24287566f5b073831fa19f68f9e099177d96b78af0897e99489b" python-versions = "^3.8" [metadata.files] @@ -563,8 +595,8 @@ attrs = [ {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, ] certifi = [ - {file = "certifi-2019.9.11-py2.py3-none-any.whl", hash = "sha256:fd7c7c74727ddcf00e9acd26bba8da604ffec95bf1c2144e67aff7a8b50e6cef"}, - {file = "certifi-2019.9.11.tar.gz", hash = "sha256:e4f3620cfea4f83eedc95b24abd9cd56f3c4b146dd0177e83a21b4eb49e21e50"}, + {file = "certifi-2019.11.28-py2.py3-none-any.whl", hash = "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3"}, + {file = "certifi-2019.11.28.tar.gz", hash = "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"}, ] cffi = [ {file = "cffi-1.13.2-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:3c9fff570f13480b201e9ab69453108f6d98244a7f495e91b6c654a47486ba43"}, @@ -778,6 +810,14 @@ regex = [ {file = "regex-2019.11.1-cp38-none-win_amd64.whl", hash = "sha256:c7393597191fc2043c744db021643549061e12abe0b3ff5c429d806de7b93b66"}, {file = "regex-2019.11.1.tar.gz", hash = "sha256:720e34a539a76a1fedcebe4397290604cc2bdf6f81eca44adb9fb2ea071c0c69"}, ] +requests = [ + {file = "requests-2.22.0-py2.py3-none-any.whl", hash = "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"}, + {file = "requests-2.22.0.tar.gz", hash = "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4"}, +] +riotwatcher = [ + {file = "riotwatcher-2.7.1-py2.py3-none-any.whl", hash = "sha256:3fb03b20f768cea7830d54c6d301a8341c67223625ac8536d26d1c140af3dcb0"}, + {file = "riotwatcher-2.7.1.tar.gz", hash = "sha256:5349271c7e00637b7619491a6070e66603705db60558ea2a690e7016f6e6d9a4"}, +] royalnet = [] sentry-sdk = [ {file = "sentry-sdk-0.13.4.tar.gz", hash = "sha256:bfc486af718c268cf49ff43d6334ed4db7333ace420240b630acdd8f8a3a8f60"}, @@ -833,29 +873,46 @@ websockets = [ {file = "websockets-8.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:3762791ab8b38948f0c4d281c8b2ddfa99b7e510e46bd8dfa942a5fff621068c"}, {file = "websockets-8.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:3db87421956f1b0779a7564915875ba774295cc86e81bc671631379371af1170"}, {file = "websockets-8.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4f9f7d28ce1d8f1295717c2c25b732c2bc0645db3215cf757551c392177d7cb8"}, + {file = "websockets-8.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:295359a2cc78736737dd88c343cd0747546b2174b5e1adc223824bcaf3e164cb"}, + {file = "websockets-8.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1d3f1bf059d04a4e0eb4985a887d49195e15ebabc42364f4eb564b1d065793f5"}, {file = "websockets-8.1-cp36-cp36m-win32.whl", hash = "sha256:2db62a9142e88535038a6bcfea70ef9447696ea77891aebb730a333a51ed559a"}, {file = "websockets-8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5"}, {file = "websockets-8.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:9b248ba3dd8a03b1a10b19efe7d4f7fa41d158fdaa95e2cf65af5a7b95a4f989"}, {file = "websockets-8.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ce85b06a10fc65e6143518b96d3dca27b081a740bae261c2fb20375801a9d56d"}, {file = "websockets-8.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:965889d9f0e2a75edd81a07592d0ced54daa5b0785f57dc429c378edbcffe779"}, + {file = "websockets-8.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:751a556205d8245ff94aeef23546a1113b1dd4f6e4d102ded66c39b99c2ce6c8"}, + {file = "websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3ef56fcc7b1ff90de46ccd5a687bbd13a3180132268c4254fc0fa44ecf4fc422"}, {file = "websockets-8.1-cp37-cp37m-win32.whl", hash = "sha256:7ff46d441db78241f4c6c27b3868c9ae71473fe03341340d2dfdbe8d79310acc"}, {file = "websockets-8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:20891f0dddade307ffddf593c733a3fdb6b83e6f9eef85908113e628fa5a8308"}, + {file = "websockets-8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c1ec8db4fac31850286b7cd3b9c0e1b944204668b8eb721674916d4e28744092"}, + {file = "websockets-8.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5c01fd846263a75bc8a2b9542606927cfad57e7282965d96b93c387622487485"}, + {file = "websockets-8.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9bef37ee224e104a413f0780e29adb3e514a5b698aabe0d969a6ba426b8435d1"}, + {file = "websockets-8.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d705f8aeecdf3262379644e4b55107a3b55860eb812b673b28d0fbc347a60c55"}, + {file = "websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:c8a116feafdb1f84607cb3b14aa1418424ae71fee131642fc568d21423b51824"}, + {file = "websockets-8.1-cp38-cp38-win32.whl", hash = "sha256:e898a0863421650f0bebac8ba40840fc02258ef4714cb7e1fd76b6a6354bda36"}, + {file = "websockets-8.1-cp38-cp38-win_amd64.whl", hash = "sha256:f8a7bff6e8664afc4e6c28b983845c5bc14965030e3fb98789734d416af77c4b"}, {file = "websockets-8.1.tar.gz", hash = "sha256:5c65d2da8c6bce0fca2528f69f44b2f977e06954c8512a952222cea50dad430f"}, ] yarl = [ - {file = "yarl-1.3.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3e2724eb9af5dc41648e5bb304fcf4891adc33258c6e14e2a7414ea32541e320"}, - {file = "yarl-1.3.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:3890ab952d508523ef4881457c4099056546593fa05e93da84c7250516e632eb"}, - {file = "yarl-1.3.0-cp35-cp35m-win32.whl", hash = "sha256:7ab825726f2940c16d92aaec7d204cfc34ac26c0040da727cf8ba87255a33829"}, - {file = "yarl-1.3.0-cp35-cp35m-win_amd64.whl", hash = "sha256:b25de84a8c20540531526dfbb0e2d2b648c13fd5dd126728c496d7c3fea33310"}, - {file = "yarl-1.3.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:2f3010703295fbe1aec51023740871e64bb9664c789cba5a6bdf404e93f7568f"}, - {file = "yarl-1.3.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5badb97dd0abf26623a9982cd448ff12cb39b8e4c94032ccdedf22ce01a64842"}, - {file = "yarl-1.3.0-cp36-cp36m-win32.whl", hash = "sha256:c9bb7c249c4432cd47e75af3864bc02d26c9594f49c82e2a28624417f0ae63b8"}, - {file = "yarl-1.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c6e341f5a6562af74ba55205dbd56d248daf1b5748ec48a0200ba227bb9e33f4"}, - {file = "yarl-1.3.0-cp37-cp37m-win32.whl", hash = "sha256:e060906c0c585565c718d1c3841747b61c5439af2211e185f6739a9412dfbde1"}, - {file = "yarl-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:73f447d11b530d860ca1e6b582f947688286ad16ca42256413083d13f260b7a0"}, - {file = "yarl-1.3.0.tar.gz", hash = "sha256:024ecdc12bc02b321bc66b41327f930d1c2c543fa9a561b39861da9388ba7aa9"}, + {file = "yarl-1.4.1-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:326f2dbaaa17b858ae86f261ae73a266fd820a561fc5142cee9d0fc58448fbd7"}, + {file = "yarl-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7ed006a220422c33ff0889288be24db56ff0a3008ffe9eaead58a690715ad09b"}, + {file = "yarl-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:80c9c213803b50899460cc355f47e66778c3c868f448b7b7de5b1f1858c82c2a"}, + {file = "yarl-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b1c178ef813940c9a5cbad42ab7b8b76ac08b594b0a6bad91063c968e0466efc"}, + {file = "yarl-1.4.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:074958fe4578ef3a3d0bdaf96bbc25e4c4db82b7ff523594776fcf3d3f16c531"}, + {file = "yarl-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d6eff151c3b23a56a5e4f496805619bc3bdf4f749f63a7a95ad50e8267c17475"}, + {file = "yarl-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:6642cbc92eaffa586180f669adc772f5c34977e9e849e93f33dc142351e98c9c"}, + {file = "yarl-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:63be649c535d18ab6230efbc06a07f7779cd4336a687672defe70c025349a47b"}, + {file = "yarl-1.4.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:56126ef061b913c3eefecace3404ca88917265d0550b8e32bbbeab29e5c830bf"}, + {file = "yarl-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:589ac1e82add13fbdedc04eb0a83400db728e5f1af2bd273392088ca90de7062"}, + {file = "yarl-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:32a3885f542f74d0f4f87057050c6b45529ebd79d0639f56582e741521575bfe"}, + {file = "yarl-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6fa05a25f2280e78a514041d4609d39962e7d51525f2439db9ad7a2ae7aac163"}, + {file = "yarl-1.4.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:ab112fba996a8f48f427e26969f2066d50080df0c24007a8cc6d7ae865e19013"}, + {file = "yarl-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2db667ee21f620b446a54a793e467714fc5a446fcc82d93a47e8bde01d69afab"}, + {file = "yarl-1.4.1-cp38-cp38-win32.whl", hash = "sha256:031e8f56cf085d3b3df6b6bce756369ea7052b82d35ea07b6045f209c819e0e5"}, + {file = "yarl-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:8bae18e2129850e76969b57869dacc72a66cccdbeebce1a28d7f3d439c21a7a3"}, + {file = "yarl-1.4.1.tar.gz", hash = "sha256:6076bce2ecc6ebf6c92919d77762f80f4c9c6ecc9c1fbaa16567ec59ad7d6f1d"}, ] youtube-dl = [ - {file = "youtube_dl-2019.11.22-py2.py3-none-any.whl", hash = "sha256:bd785113687f201415389156664b9ebd81698fb6eb44c6d9fd35898619e27bf7"}, - {file = "youtube_dl-2019.11.22.tar.gz", hash = "sha256:0575efd332cb9817f5a1fffd2a1e569e5a7d3642e7c24c7a5c47cbf70f301f25"}, + {file = "youtube_dl-2019.11.28-py2.py3-none-any.whl", hash = "sha256:43d6b991a34934fec2be20b93d4774ccc8642db1e5f0b8f1569f53b8d769af48"}, + {file = "youtube_dl-2019.11.28.tar.gz", hash = "sha256:de2254dc38472b0e0e3ac4d1e95a9e636ec790af83e7b055e1e09f03eb61bb5c"}, ] diff --git a/pyproject.toml b/pyproject.toml index 7ac483ac..41e68a12 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,8 @@ [tool.poetry.dependencies] python = "^3.8" + riotwatcher = "^2.7.1" + [tool.poetry.dependencies.royalnet] git = "https://github.com/Steffo99/royalnet/" # Maybe... there is a way to make these selectable? diff --git a/royalpack/commands/__init__.py b/royalpack/commands/__init__.py index d5e9fe33..8026721f 100644 --- a/royalpack/commands/__init__.py +++ b/royalpack/commands/__init__.py @@ -3,10 +3,10 @@ from .ciaoruozi import CiaoruoziCommand from .color import ColorCommand from .cv import CvCommand from .diario import DiarioCommand -# from .rage import RageCommand -# from .reminder import ReminderCommand -# from .ship import ShipCommand -# from .smecds import SmecdsCommand +from .rage import RageCommand +from .reminder import ReminderCommand +from .ship import ShipCommand +from .smecds import SmecdsCommand # from .videochannel import VideochannelCommand # from .trivia import TriviaCommand # from .matchmaking import MatchmakingCommand @@ -20,7 +20,7 @@ from .diario import DiarioCommand # from .soundcloud import SoundcloudCommand # from .zawarudo import ZawarudoCommand from .emojify import EmojifyCommand -# from .leagueoflegends import LeagueoflegendsCommand +from .leagueoflegends import LeagueoflegendsCommand from .diarioquote import DiarioquoteCommand # from .mp3 import Mp3Command from .peertube import PeertubeCommand @@ -31,10 +31,10 @@ available_commands = [ ColorCommand, CvCommand, DiarioCommand, - # RageCommand, - # ReminderCommand, - # ShipCommand, - # SmecdsCommand, + RageCommand, + ReminderCommand, + ShipCommand, + SmecdsCommand, # VideochannelCommand, # TriviaCommand, # MatchmakingCommand, @@ -48,7 +48,7 @@ available_commands = [ # SoundcloudCommand, # ZawarudoCommand, EmojifyCommand, - # LeagueoflegendsCommand, + LeagueoflegendsCommand, DiarioquoteCommand, # Mp3Command, PeertubeCommand, diff --git a/royalpack/commands/cv.py b/royalpack/commands/cv.py index b602b329..ab6ee15d 100644 --- a/royalpack/commands/cv.py +++ b/royalpack/commands/cv.py @@ -154,9 +154,23 @@ class CvCommand(Command): name = member['name'] activity = "" - if len(member["activities"]) >= 1: - # TODO: how to render activities now? - ... + for mact in member["activities"]: + # Playing + if mact["type"] == 0: + activity += f" | 🎮 {mact['name']}" + if "state" in mact and "details" in mact: + activity += f" ({mact['state']} | {mact['details']})" + elif "state" in mact: + activity += f" ({mact['state']})" + elif "details" in mact: + activity += f" ({mact['details']})" + activity += "\n" + # Custom Status + elif mact["type"] == 4: + activity += f" | ❓ {mact['state']}" + else: + # TODO: what other activity types are there? + breakpoint() return f"{status}{voice} {name}{activity}\n" @@ -233,7 +247,7 @@ class CvCommand(Command): draw = True for role in member["roles"]: - if role["id"] == self.interface.cfg["Cv"]["displayed_role_id"]: + if role["id"] == self.interface.config["Cv"]["displayed_role_id"]: break else: if display_only_role: diff --git a/royalpack/commands/diario.py b/royalpack/commands/diario.py index a7e33eaf..6ba99de9 100644 --- a/royalpack/commands/diario.py +++ b/royalpack/commands/diario.py @@ -65,7 +65,7 @@ class DiarioCommand(Command): if photosizes: # Text is a caption text = reply.caption - media_url = await to_imgur(self.interface.cfg["Imgur"]["token"], + media_url = await to_imgur(self.interface.config["Imgur"]["token"], photosizes, text if text is not None else "") else: media_url = None @@ -93,7 +93,7 @@ class DiarioCommand(Command): # Check if there's an image associated with the reply photosizes: Optional[List[telegram.PhotoSize]] = message.photo if photosizes: - media_url = await to_imgur(self.interface.cfg["Imgur"]["token"], + media_url = await to_imgur(self.interface.config["Imgur"]["token"], photosizes, raw_text if raw_text is not None else "") else: media_url = None diff --git a/royalpack/commands/leagueoflegends.py b/royalpack/commands/leagueoflegends.py index 227afa53..bc90e5c9 100644 --- a/royalpack/commands/leagueoflegends.py +++ b/royalpack/commands/leagueoflegends.py @@ -5,6 +5,7 @@ import asyncio import sentry_sdk from royalnet.commands import * from royalnet.utils import * +from royalnet.serf.telegram import * from ..tables import LeagueOfLegends from ..utils import LeagueLeague @@ -20,25 +21,19 @@ class LeagueoflegendsCommand(Command): syntax = "[nomeevocatore]" - tables = {LeagueOfLegends} - - _region = "euw1" - - _telegram_group_id = -1001153723135 - def __init__(self, interface: CommandInterface): super().__init__(interface) - self._riotwatcher = riotwatcher.RiotWatcher(api_key=self.interface.bot.get_secret("leagueoflegends")) + self._riotwatcher = riotwatcher.RiotWatcher(api_key=self.config["Lol"]["token"]) if self.interface.name == "telegram": self.loop.create_task(self._updater(900)) async def _send(self, message): - client = self.interface.bot.client - await self.interface.bot.safe_api_call(client.send_message, - chat_id=self._telegram_group_id, - text=telegram_escape(message), - parse_mode="HTML", - disable_webpage_preview=True) + client = self.serf.client + await self.serf.api_call(client.send_message, + chat_id=self.config["Telegram"]["main_group_id"], + text=escape(message), + parse_mode="HTML", + disable_webpage_preview=True) async def _notify(self, obj: LeagueOfLegends, @@ -86,7 +81,7 @@ class LeagueoflegendsCommand(Command): async def _update(self, lol: LeagueOfLegends): log.info(f"Updating: {lol}") log.debug(f"Getting summoner data: {lol}") - summoner = await asyncify(self._riotwatcher.summoner.by_id, region=self._region, + summoner = await asyncify(self._riotwatcher.summoner.by_id, region=self.config["Lol"]["region"], encrypted_summoner_id=lol.summoner_id) await self._change(lol, "profile_icon_id", summoner["profileIconId"], self._notify) await self._change(lol, "summoner_name", summoner["name"], self._notify) @@ -95,7 +90,7 @@ class LeagueoflegendsCommand(Command): await self._change(lol, "summoner_id", summoner["id"], self._notify) await self._change(lol, "account_id", summoner["accountId"], self._notify) log.debug(f"Getting leagues data: {lol}") - leagues = await asyncify(self._riotwatcher.league.by_summoner, region=self._region, + leagues = await asyncify(self._riotwatcher.league.by_summoner, region=self.config["Lol"]["region"], encrypted_summoner_id=lol.summoner_id) soloq = LeagueLeague() flexq = LeagueLeague() @@ -115,7 +110,8 @@ class LeagueoflegendsCommand(Command): await self._change(lol, "rank_twtrq", twtrq, self._notify) await self._change(lol, "rank_tftq", tftq, self._notify) log.debug(f"Getting mastery data: {lol}") - mastery = await asyncify(self._riotwatcher.champion_mastery.scores_by_summoner, region=self._region, + mastery = await asyncify(self._riotwatcher.champion_mastery.scores_by_summoner, + region=self.config["Lol"]["region"], encrypted_summoner_id=lol.summoner_id) await self._change(lol, "mastery_score", mastery, self._notify) @@ -138,7 +134,8 @@ class LeagueoflegendsCommand(Command): log.info(f"Sleeping for {period}s") await asyncio.sleep(period) - def _display(self, lol: LeagueOfLegends): + @staticmethod + def _display(lol: LeagueOfLegends) -> str: string = f"ℹ️ [b]{lol.summoner_name}[/b]\n" \ f"Lv. {lol.summoner_level}\n" \ f"Mastery score: {lol.mastery_score}\n" \ @@ -161,7 +158,7 @@ class LeagueoflegendsCommand(Command): if name: # Connect a new League of Legends account to Royalnet log.debug(f"Searching for: {name}") - summoner = self._riotwatcher.summoner.by_name(region=self._region, summoner_name=name) + summoner = self._riotwatcher.summoner.by_name(region=self.config["Lol"]["region"], summoner_name=name) # Ensure the account isn't already connected to something else leagueoflegends = await asyncify( data.session.query(self.alchemy.LeagueOfLegends).filter_by(summoner_id=summoner["id"]).one_or_none) @@ -169,7 +166,8 @@ class LeagueoflegendsCommand(Command): raise CommandError(f"L'account {leagueoflegends} è già registrato su Royalnet.") # Get rank information log.debug(f"Getting leagues data: {name}") - leagues = self._riotwatcher.league.by_summoner(region=self._region, encrypted_summoner_id=summoner["id"]) + leagues = self._riotwatcher.league.by_summoner(region=self.config["Lol"]["region"], + encrypted_summoner_id=summoner["id"]) soloq = LeagueLeague() flexq = LeagueLeague() twtrq = LeagueLeague() @@ -185,11 +183,11 @@ class LeagueoflegendsCommand(Command): tftq = LeagueLeague.from_dict(league) # Get mastery score log.debug(f"Getting mastery data: {name}") - mastery = self._riotwatcher.champion_mastery.scores_by_summoner(region=self._region, + mastery = self._riotwatcher.champion_mastery.scores_by_summoner(region=self.config["Lol"]["region"], encrypted_summoner_id=summoner["id"]) # Create database row leagueoflegends = self.alchemy.LeagueOfLegends( - region=self._region, + region=self.config["Lol"]["region"], user=author, profile_icon_id=summoner["profileIconId"], summoner_name=summoner["name"], @@ -210,7 +208,7 @@ class LeagueoflegendsCommand(Command): else: # Update and display the League of Legends stats for the current account if len(author.leagueoflegends) == 0: - raise CommandError("Nessun account di League of Legends trovato.") + raise UserError("Nessun account di League of Legends trovato.") message = "" for account in author.leagueoflegends: try: diff --git a/royalpack/commands/rage.py b/royalpack/commands/rage.py index 91435811..fa4a991a 100644 --- a/royalpack/commands/rage.py +++ b/royalpack/commands/rage.py @@ -10,11 +10,11 @@ class RageCommand(Command): description: str = "Arrabbiati per qualcosa, come una software house californiana." - MAD = ["MADDEN MADDEN MADDEN MADDEN", + _MAD = ["MADDEN MADDEN MADDEN MADDEN", "EA bad, praise Geraldo!", "Stai sfogando la tua ira sul bot!", "Basta, io cambio gilda!", "Fondiamo la RRYG!"] async def run(self, args: CommandArgs, data: CommandData) -> None: - await data.reply(f"😠 {random.sample(self.MAD, 1)[0]}") + await data.reply(f"😠 {random.sample(self._MAD, 1)[0]}") diff --git a/royalpack/commands/reminder.py b/royalpack/commands/reminder.py index e33b5e80..ae50896c 100644 --- a/royalpack/commands/reminder.py +++ b/royalpack/commands/reminder.py @@ -6,7 +6,9 @@ import telegram import discord from sqlalchemy import and_ from royalnet.commands import * -from royalnet.utils import sleep_until, asyncify, telegram_escape, discord_escape +from royalnet.utils import * +from royalnet.serf.telegram import escape as telegram_escape +from royalnet.serf.discord import escape as discord_escape from ..tables import Reminder @@ -19,16 +21,14 @@ class ReminderCommand(Command): syntax: str = "[ {data} ] {messaggio}" - tables = {Reminder} - def __init__(self, interface: CommandInterface): super().__init__(interface) session = interface.alchemy.Session() reminders = ( - session.query(interface.alchemy.Reminder) + session.query(interface.alchemy.get(Reminder)) .filter(and_( - interface.alchemy.Reminder.datetime >= datetime.datetime.now(), - interface.alchemy.Reminder.interface_name == interface.name)) + interface.alchemy.get(Reminder).datetime >= datetime.datetime.now(), + interface.alchemy.get(Reminder).interface_name == interface.name)) .all() ) for reminder in reminders: @@ -38,16 +38,16 @@ class ReminderCommand(Command): await sleep_until(reminder.datetime) if self.interface.name == "telegram": chat_id: int = pickle.loads(reminder.raw_interface_data) - bot: telegram.Bot = self.interface.bot.client - await asyncify(bot.send_message, - chat_id=chat_id, - text=telegram_escape(f"❗️ {reminder.message}"), - parse_mode="HTML", - disable_web_page_preview=True) + client: telegram.Bot = self.serf.client + await self.serf.api_call(client.send_message, + chat_id=chat_id, + text=telegram_escape(f"❗️ {reminder.message}"), + parse_mode="HTML", + disable_web_page_preview=True) elif self.interface.name == "discord": channel_id: int = pickle.loads(reminder.raw_interface_data) - bot: discord.Client = self.interface.bot.client - channel = bot.get_channel(channel_id) + client: discord.Client = self.serf.client + channel = client.get_channel(channel_id) await channel.send(discord_escape(f"❗️ {reminder.message}")) async def run(self, args: CommandArgs, data: CommandData) -> None: diff --git a/royalpack/commands/ship.py b/royalpack/commands/ship.py index 83677766..cce37a1b 100644 --- a/royalpack/commands/ship.py +++ b/royalpack/commands/ship.py @@ -1,7 +1,5 @@ -import typing import re from royalnet.commands import * -from royalnet.utils import safeformat class ShipCommand(Command): @@ -34,7 +32,4 @@ class ShipCommand(Command): part_two = match_two.group(0) # Combine the two name parts mixed = part_one + part_two - await data.reply(safeformat("💕 {one} + {two} = [b]{result}[/b]", - one=name_one.capitalize(), - two=name_two.capitalize(), - result=mixed.capitalize())) + await data.reply(f"💕 {part_one.capitalize()} + {part_two.capitalize()} = [b]{mixed.capitalize()}[/b]") diff --git a/royalpack/commands/smecds.py b/royalpack/commands/smecds.py index d83f453a..e5a54efa 100644 --- a/royalpack/commands/smecds.py +++ b/royalpack/commands/smecds.py @@ -11,60 +11,59 @@ class SmecdsCommand(Command): description: str = "Secondo me, è colpa dello stagista..." - syntax = "" + _DS_LIST = ["della secca", "del seccatore", "del secchiello", "del secchio", "del secchione", "del secondino", + "del sedano", "del sedativo", "della sedia", "del sedicente", "del sedile", "della sega", "del segale", + "della segatura", "della seggiola", "del seggiolino", "della seggiovia", "della segheria", + "del seghetto", "del segnalibro", "del segnaposto", "del segno", "del segretario", "della segreteria", + "del seguace", "del segugio", "della selce", "della sella", "della selz", "della selva", + "della selvaggina", "del semaforo", "del seme", "del semifreddo", "del seminario", "della seminarista", + "della semola", "del semolino", "del semplicione", "della senape", "del senatore", "del seno", + "del sensore", "della sentenza", "della sentinella", "del sentore", "della seppia", "del sequestratore", + "della serenata", "del sergente", "del sermone", "della serpe", "del serpente", "della serpentina", + "della serra", "del serraglio", "del serramanico", "della serranda", "della serratura", "del servitore", + "della servitù", "del servizievole", "del servo", "del set", "della seta", "della setola", "del sigaro", + "del sidecar", "del siderurgico", "del sidro", "della siepe", "del sifone", "della sigaretta", + "del sigillo", "della signora", "della signorina", "del silenziatore", "della silhouette", + "del silicio", + "del silicone", "del siluro", "della sinagoga", "della sindacalista", "del sindacato", "del sindaco", + "della sindrome", "della sinfonia", "del sipario", "del sire", "della sirena", "della siringa", + "del sismografo", "del sobborgo", "del sobillatore", "del sobrio", "del soccorritore", "del socio", + "del sociologo", "della soda", "del sofà", "della soffitta", "del software", "dello sogghignare", + "del soggiorno", "della sogliola", "del sognatore", "della soia", "del solaio", "del solco", + "del soldato", "del soldo", "del sole", "della soletta", "della solista", "del solitario", + "del sollazzare", "del sollazzo", "del sollecito", "del solleone", "del solletico", "del sollevare", + "del sollievo", "del solstizio", "del solubile", "del solvente", "della soluzione", "del somaro", + "del sombrero", "del sommergibile", "del sommo", "della sommossa", "del sommozzatore", "del sonar", + "della sonda", "del sondaggio", "del sondare", "del sonnacchioso", "del sonnambulo", "del sonnellino", + "del sonnifero", "del sonno", "della sonnolenza", "del sontuoso", "del soppalco", "del soprabito", + "del sopracciglio", "del sopraffare", "del sopraffino", "del sopraluogo", "del sopramobile", + "del soprannome", "del soprano", "del soprappensiero", "del soprassalto", "del soprassedere", + "del sopravvento", "del sopravvivere", "del soqquadro", "del sorbetto", "del sordido", "della sordina", + "del sordo", "della sorella", "della sorgente", "del sornione", "del sorpasso", "della sorpresa", + "del sorreggere", "del sorridere", "della sorsata", "del sorteggio", "del sortilegio", + "del sorvegliante", "del sorvolare", "del sosia", "del sospettoso", "del sospirare", "della sosta", + "della sostanza", "del sostegno", "del sostenitore", "del sostituto", "del sottaceto", "della sottana", + "del sotterfugio", "del sotterraneo", "del sottile", "del sottilizzare", "del sottintendere", + "del sottobanco", "del sottobosco", "del sottomarino", "del sottopassaggio", "del sottoposto", + "del sottoscala", "della sottoscrizione", "del sottostare", "del sottosuolo", "del sottotetto", + "del sottotitolo", "del sottovalutare", "del sottovaso", "della sottoveste", "del sottovuoto", + "del sottufficiale", "della soubrette", "del souvenir", "del soverchiare", "del sovrano", + "del sovrapprezzo", "della sovvenzione", "del sovversivo", "del sozzo", "dello suadente", "del sub", + "del subalterno", "del subbuglio", "del subdolo", "del sublime", "del suburbano", "del successore", + "del succo", "della succube", "del succulento", "della succursale", "del sudario", "della sudditanza", + "del suddito", "del sudicio", "del suffisso", "del suffragio", "del suffumigio", "del suggeritore", + "del sughero", "del sugo", "del suino", "della suite", "del sulfureo", "del sultano", "di Steffo", + "di Spaggia", "di Sabrina", "del sas", "del ses", "del sis", "del sos", "del sus", "della supremazia", + "del Santissimo", "della scatola", "del supercalifragilistichespiralidoso", "del sale", "del salame", + "di (Town of) Salem", "di Stronghold", "di SOMA", "dei Saints", "di S.T.A.L.K.E.R.", "di Sanctum", + "dei Sims", "di Sid", "delle Skullgirls", "di Sonic", "di Spiral (Knights)", "di Spore", "di Starbound", + "di SimCity", "di Sensei", "di Ssssssssssssss... Boom! E' esploso il dizionario", "della scala", + "di Sakura", "di Suzie", "di Shinji", "del senpai", "del support", "di Superman", "di Sekiro", + "dello Slime God", "del salassato", "della salsa", "di Senjougahara", "di Sugar", "della Stampa", + "della Stampante"] - DS_LIST = ["della secca", "del seccatore", "del secchiello", "del secchio", "del secchione", "del secondino", - "del sedano", "del sedativo", "della sedia", "del sedicente", "del sedile", "della sega", "del segale", - "della segatura", "della seggiola", "del seggiolino", "della seggiovia", "della segheria", - "del seghetto", "del segnalibro", "del segnaposto", "del segno", "del segretario", "della segreteria", - "del seguace", "del segugio", "della selce", "della sella", "della selz", "della selva", - "della selvaggina", "del semaforo", "del seme", "del semifreddo", "del seminario", "della seminarista", - "della semola", "del semolino", "del semplicione", "della senape", "del senatore", "del seno", - "del sensore", "della sentenza", "della sentinella", "del sentore", "della seppia", "del sequestratore", - "della serenata", "del sergente", "del sermone", "della serpe", "del serpente", "della serpentina", - "della serra", "del serraglio", "del serramanico", "della serranda", "della serratura", "del servitore", - "della servitù", "del servizievole", "del servo", "del set", "della seta", "della setola", "del sigaro", - "del sidecar", "del siderurgico", "del sidro", "della siepe", "del sifone", "della sigaretta", - "del sigillo", "della signora", "della signorina", "del silenziatore", "della silhouette", "del silicio", - "del silicone", "del siluro", "della sinagoga", "della sindacalista", "del sindacato", "del sindaco", - "della sindrome", "della sinfonia", "del sipario", "del sire", "della sirena", "della siringa", - "del sismografo", "del sobborgo", "del sobillatore", "del sobrio", "del soccorritore", "del socio", - "del sociologo", "della soda", "del sofà", "della soffitta", "del software", "dello sogghignare", - "del soggiorno", "della sogliola", "del sognatore", "della soia", "del solaio", "del solco", - "del soldato", "del soldo", "del sole", "della soletta", "della solista", "del solitario", - "del sollazzare", "del sollazzo", "del sollecito", "del solleone", "del solletico", "del sollevare", - "del sollievo", "del solstizio", "del solubile", "del solvente", "della soluzione", "del somaro", - "del sombrero", "del sommergibile", "del sommo", "della sommossa", "del sommozzatore", "del sonar", - "della sonda", "del sondaggio", "del sondare", "del sonnacchioso", "del sonnambulo", "del sonnellino", - "del sonnifero", "del sonno", "della sonnolenza", "del sontuoso", "del soppalco", "del soprabito", - "del sopracciglio", "del sopraffare", "del sopraffino", "del sopraluogo", "del sopramobile", - "del soprannome", "del soprano", "del soprappensiero", "del soprassalto", "del soprassedere", - "del sopravvento", "del sopravvivere", "del soqquadro", "del sorbetto", "del sordido", "della sordina", - "del sordo", "della sorella", "della sorgente", "del sornione", "del sorpasso", "della sorpresa", - "del sorreggere", "del sorridere", "della sorsata", "del sorteggio", "del sortilegio", - "del sorvegliante", "del sorvolare", "del sosia", "del sospettoso", "del sospirare", "della sosta", - "della sostanza", "del sostegno", "del sostenitore", "del sostituto", "del sottaceto", "della sottana", - "del sotterfugio", "del sotterraneo", "del sottile", "del sottilizzare", "del sottintendere", - "del sottobanco", "del sottobosco", "del sottomarino", "del sottopassaggio", "del sottoposto", - "del sottoscala", "della sottoscrizione", "del sottostare", "del sottosuolo", "del sottotetto", - "del sottotitolo", "del sottovalutare", "del sottovaso", "della sottoveste", "del sottovuoto", - "del sottufficiale", "della soubrette", "del souvenir", "del soverchiare", "del sovrano", - "del sovrapprezzo", "della sovvenzione", "del sovversivo", "del sozzo", "dello suadente", "del sub", - "del subalterno", "del subbuglio", "del subdolo", "del sublime", "del suburbano", "del successore", - "del succo", "della succube", "del succulento", "della succursale", "del sudario", "della sudditanza", - "del suddito", "del sudicio", "del suffisso", "del suffragio", "del suffumigio", "del suggeritore", - "del sughero", "del sugo", "del suino", "della suite", "del sulfureo", "del sultano", "di Steffo", - "di Spaggia", "di Sabrina", "del sas", "del ses", "del sis", "del sos", "del sus", "della supremazia", - "del Santissimo", "della scatola", "del supercalifragilistichespiralidoso", "del sale", "del salame", - "di (Town of) Salem", "di Stronghold", "di SOMA", "dei Saints", "di S.T.A.L.K.E.R.", "di Sanctum", - "dei Sims", "di Sid", "delle Skullgirls", "di Sonic", "di Spiral (Knights)", "di Spore", "di Starbound", - "di SimCity", "di Sensei", "di Ssssssssssssss... Boom! E' esploso il dizionario", "della scala", - "di Sakura", "di Suzie", "di Shinji", "del senpai", "del support", "di Superman", "di Sekiro", - "dello Slime God", "del salassato", "della salsa", "di Senjougahara", "di Sugar", "della Stampa", - "della Stampante"] - - SMECDS = "🤔 Secondo me, è colpa {ds}." + _SMECDS = "🤔 Secondo me, è colpa {ds}." async def run(self, args: CommandArgs, data: CommandData) -> None: - ds = random.sample(self.DS_LIST, 1)[0] - await data.reply(safeformat(self.SMECDS, ds=ds)) + ds = random.sample(self._DS_LIST, 1)[0] + await data.reply(safeformat(self._SMECDS, ds=ds)) diff --git a/royalpack/events/discord_cv.py b/royalpack/events/discord_cv.py index 6ccfa829..e4af63ba 100644 --- a/royalpack/events/discord_cv.py +++ b/royalpack/events/discord_cv.py @@ -70,7 +70,7 @@ class DiscordCvEvent(Event): "mobile": member.mobile_status.value, "web": member.web_status.value, }, - "activities": [], + "activities": [activity.to_dict() for activity in member.activities if activity is not None], "roles": [{ "id": role.id, "name": role.name, @@ -81,9 +81,6 @@ class DiscordCvEvent(Event): } for role in member.roles] } - for activity in member.activities: - ... - results.append(data) return { diff --git a/royalpack/utils/leagueleague.py b/royalpack/utils/leagueleague.py index 96d17523..85c82c88 100644 --- a/royalpack/utils/leagueleague.py +++ b/royalpack/utils/leagueleague.py @@ -70,6 +70,10 @@ class LeagueLeague: return True if not isinstance(other, LeagueLeague): raise TypeError(f"Can't compare {self.__class__.__qualname__} with {other.__class__.__qualname__}") + if self.empty: + return False + elif other.empty: + return True if not (bool(self) and bool(other)): raise ValueError("Can't compare partial LeagueLeagues.") if self.tier != other.tier: @@ -100,6 +104,20 @@ class LeagueLeague: result &= self.tier is not None return result + @property + def empty(self): + result = True + result &= self.veteran is None + result &= self.fresh_blood is None + result &= self.hot_streak is None + result &= self.inactive is None + result &= self.losses is None + result &= self.wins is None + result &= self.points is None + result &= self.rank is None + result &= self.tier is None + return result + def __composite_values__(self): return self.tier, \ self.rank, \