From 488c49e42eb965793d1c41adee3d53d3e09110c6 Mon Sep 17 00:00:00 2001 From: Kepka Ludovic Date: Fri, 15 Aug 2025 15:55:07 +0200 Subject: [PATCH] ajout commande protondb --- discordbot/__init__.py | 24 +++++---- protondb/__init__.py | 76 +++++++++++++++++----------- webapp/configurations.py | 2 + webapp/templates/configurations.html | 13 +++++ 4 files changed, 76 insertions(+), 39 deletions(-) diff --git a/discordbot/__init__.py b/discordbot/__init__.py index 61e5af9..27acb92 100644 --- a/discordbot/__init__.py +++ b/discordbot/__init__.py @@ -9,6 +9,8 @@ import requests from database import db from database.helpers import ConfigurationHelper from database.models import Configuration, GameBundle, Humeur +from protondb import searhProtonDb + class DiscordBot(discord.Client): async def on_ready(self): @@ -53,10 +55,6 @@ class DiscordBot(discord.Client): # toute les 30 minutes await asyncio.sleep(30*60) - # TODO voir ce que je prend - def event(self, coro): - return super().event(coro) - def begin(self) : token = Configuration.query.filter_by(key='discord_token').first() if token : @@ -65,12 +63,20 @@ class DiscordBot(discord.Client): logging.error('pas de token on ne lance pas discord') intents = discord.Intents.default() +intents.message_content = True bot = DiscordBot(intents=intents) -# TODO voir ce que je prend @bot.event async def on_message(message): - if message.channel.id == 1234567: - @bot.command() - async def name(ctx, arg): - await ctx.send(f"hello {arg}") + content: str = message.content; + if(ConfigurationHelper().getValue('proton_db_enable_enable') and content.find('!protondb')==0) : + if (content.find('@')>0) : + user = content[content.find('@'):] + else : + user = f'@{message.author.name}' + name = message.content.replace('!protondb', '').replace(f'{user}', '').strip(); + games = searhProtonDb(name) + msg = f'{user} J\'ai trouvé {len(games)} jeux :\n' + for game in games: + msg += f'- [{game.get('name')}](https://www.protondb.com/app/{game.get('id')}) classé **{game.get('tier')}**\n' + await message.channel.send(msg) diff --git a/protondb/__init__.py b/protondb/__init__.py index df5909a..a7fcced 100644 --- a/protondb/__init__.py +++ b/protondb/__init__.py @@ -1,36 +1,52 @@ +import logging import requests -from algoliasearch.search.client import SearchClientSync, SearchConfig, RequestOptions -app_id = "94HE6YATEI" -api_key = "9ba0e69fb2974316cdaec8f5f257088f" +from algoliasearch.search.client import SearchClientSync, SearchConfig +from database.helpers import ConfigurationHelper -search_name = "call of duty" +def _call_algoliasearch(search_name:str): + config = SearchConfig(ConfigurationHelper().getValue('proton_db_api_id'), + ConfigurationHelper().getValue('proton_db_api_key')) + config.set_default_hosts() + client = SearchClientSync(config=config) + return client.search_single_index(index_name="steamdb", + search_params={ + "query":search_name, + "facetFilters":[["appType:Game"]], + "hitsPerPage":50}, + request_options= {'headers':{'Referer':'https://www.protondb.com/'}}) +def _call_summary(id): + response = requests.get(f'http://jazzy-starlight-aeea19.netlify.app/api/v1/reports/summaries/{id}.json') + if (response.status_code == 200) : + return response.json() + logging.error(f'{response.status_code} on {id}') + return None + +def _is_name_match(name:str, search_name:str) -> bool: + return name.lower().find(search_name.lower()) >= 0 + +def searhProtonDb(search_name:str): + results = [] + responses = _call_algoliasearch(search_name) + for hit in responses.model_dump().get('hits'): + id = hit.get('object_id') + name:str = hit.get('name') + if (_is_name_match(name, search_name)) : + try: + summmary = _call_summary(id) + if (summmary != None) : + tier = summmary.get('tier') + results.append({ + 'id':id, + 'name' : name, + 'tier' : tier + }) + logging.info(f'found {name}({id} : {tier}') + except Exception as e: + logging.error(f'error on {name}({id}): {e}') + else: + logging.info(f'{name}({id} ne contient pas {search_name})') + return results -config = SearchConfig(app_id, api_key) -config.set_default_hosts() -client = SearchClientSync(app_id, api_key, config=config) -options = RequestOptions(config=config, headers={'referers':'https://www.protondb.com/'}) -responses = client.search_single_index(index_name="steamdb", - search_params={ - "query":"call of duty", - "facetFilters":[["appType:Game"]], - "hitsPerPage":50}, - request_options= {'headers':{'Referer':'https://www.protondb.com/'}}) -for hit in responses.model_dump().get('hits'): - id = hit.get('object_id') - name:str = hit.get('name') - if (name.lower().find(search_name.lower())>=0) : - try: - response = requests.get(f'http://jazzy-starlight-aeea19.netlify.app/api/v1/reports/summaries/{id}.json') - if (response.status_code == 200) : - summmary = response.json() - tier = summmary.get('tier') - print(f'{name} : {tier}') - else : - print(f'{response.status_code} on {name}({id})') - except Exception as e: - print(f'error on {name}({id}): {e}') - else: - print(f'{name}({id} ne contient pas {search_name})') diff --git a/webapp/configurations.py b/webapp/configurations.py index e629e69..1cd6534 100644 --- a/webapp/configurations.py +++ b/webapp/configurations.py @@ -20,5 +20,7 @@ def updateConfiguration(): # Je fait ca car html n'envoi pas le parametre de checkbox quand il est décoché if (request.form.get("humble_bundle_channel") != None and request.form.get("humble_bundle_enable") == None) : ConfigurationHelper().createOrUpdate('humble_bundle_enable', False) + if (request.form.get("proton_db_api_id") != None and request.form.get("proton_db_enable_enable") == None) : + ConfigurationHelper().createOrUpdate('proton_db_enable_enable', False) db.session.commit() return redirect(url_for('openConfigurations')) diff --git a/webapp/templates/configurations.html b/webapp/templates/configurations.html index f2e6038..5c65d6f 100644 --- a/webapp/templates/configurations.html +++ b/webapp/templates/configurations.html @@ -20,6 +20,19 @@ +

Proton DB

+
+ + + + + + + + +
+

Api