diff --git a/.gitignore b/.gitignore
index 5d381cc..ae331fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -160,3 +160,4 @@ cython_debug/
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
+fr.mrraph.hoarder-bot-v0.0.2.mbp
diff --git a/base-config.yaml b/base-config.yaml
new file mode 100644
index 0000000..64c2165
--- /dev/null
+++ b/base-config.yaml
@@ -0,0 +1,3 @@
+hoarder_url: "http://hoarder.local"
+hoarder_api_key: "votre_cle_api"
+command_prefix: hoarder
\ No newline at end of file
diff --git a/hoarder.py b/hoarder.py
new file mode 100644
index 0000000..f9571e1
--- /dev/null
+++ b/hoarder.py
@@ -0,0 +1,82 @@
+import re
+import aiohttp
+from typing import Type
+from mautrix.util.config import BaseProxyConfig, ConfigUpdateHelper
+from maubot import Plugin, MessageEvent
+from maubot.handlers import event, command
+from datetime import datetime
+
+# Setup config file
+class Config(BaseProxyConfig):
+ def do_update(self, helper: ConfigUpdateHelper) -> None:
+ helper.copy("hoarder_url")
+ helper.copy("hoarder_api_key")
+ helper.copy("command_prefix")
+
+class HoarderForwarder(Plugin):
+ async def start(self) -> None:
+ await super().start()
+ self.config.load_and_update()
+
+ @classmethod
+ def get_config_class(cls) -> Type[BaseProxyConfig]:
+ return Config
+
+ async def get_page_title(self, url: str) -> str:
+ """Récupère le titre de la page web à partir de l'URL sans utiliser BeautifulSoup."""
+ try:
+ async with aiohttp.ClientSession() as session:
+ async with session.get(url) as response:
+ if response.status == 200:
+ html = await response.text()
+ # Rechercher la balise
+ match = re.search(r"(.*?)", html, re.IGNORECASE | re.DOTALL)
+ if match:
+ return match.group(1).strip()
+ else:
+ return "Sans titre"
+ else:
+ return "Titre introuvable"
+ except Exception as e:
+ print(f"Erreur lors de la récupération du titre: {e}")
+ return "Erreur"
+
+ @command.new(
+ "hoarder",
+ )
+
+ @command.argument("url", pass_raw=True, required=True)
+ async def send_to_hoarder(self, evt: MessageEvent, url: str) -> None:
+ await evt.mark_read()
+
+ hoarder_url = self.config["hoarder_url"] + '/api/trpc/bookmarks.createBookmark'
+ api_key = self.config["hoarder_api_key"]
+
+ self.log.info(hoarder_url)
+ #title = await self.get_page_title(url) # Récupère le titre de la page
+
+ if not hoarder_url or not api_key:
+ self.log.warning("L'URL ou la clé API de Hoarder n'est pas configurée.")
+ return
+
+ headers = {
+ "Authorization": f"Bearer {api_key}",
+ "Content-Type": "application/json",
+ "Accept": "application/json",
+ }
+ payload = {
+ "json": {
+ "type": "link",
+ "url": url
+ }
+ }
+
+ try:
+ async with aiohttp.ClientSession() as session:
+ async with session.post(hoarder_url, json=payload, headers=headers) as response:
+ if response.status == 201:
+ self.log.info(f"URL envoyée avec succès à Hoarder : {url}")
+ else:
+ self.log.error(f"Échec de l'envoi de l'URL à Hoarder : {response.status}")
+ except Exception as e:
+ self.log.exception(f"Erreur lors de l'envoi de l'URL à Hoarder : {e}")
diff --git a/maubot.yaml b/maubot.yaml
new file mode 100644
index 0000000..a4f8e09
--- /dev/null
+++ b/maubot.yaml
@@ -0,0 +1,44 @@
+# This is an example maubot plugin definition file.
+# All plugins must include a file like this named "maubot.yaml" in their root directory.
+
+# Target maubot version
+maubot: 0.1.0
+
+# The unique ID for the plugin. Java package naming style. (i.e. use your own domain, not xyz.maubot)
+id: fr.mrraph.hoarder-bot
+
+# A PEP 440 compliant version string.
+version: 0.0.2
+
+# The SPDX license identifier for the plugin. https://spdx.org/licenses/
+# Optional, assumes all rights reserved if omitted.
+license: MIT
+
+# The list of modules to load from the plugin archive.
+# Modules can be directories with an __init__.py file or simply python files.
+# Submodules that are imported by modules listed here don't need to be listed separately.
+# However, top-level modules must always be listed even if they're imported by other modules.
+modules:
+- hoarder
+#- config
+# The main class of the plugin. Format: module/Class
+# If `module` is omitted, will default to last module specified in the module list.
+# Even if `module` is not omitted here, it must be included in the modules list.
+# The main class must extend maubot.Plugin
+main_class: HoarderForwarder
+
+# Whether or not instances need a database
+database: false
+
+# Extra files that the upcoming build tool should include in the mbp file.
+config: true
+extra_files:
+ - base-config.yaml
+#- LICENSE
+
+# List of dependencies
+#dependencies:
+#- config
+
+#soft_dependencies:
+#- bar>=0.1
\ No newline at end of file