aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPinapelz <yukais@pinapelz.com>2025-04-13 21:05:50 -0700
committerPinapelz <yukais@pinapelz.com>2025-04-13 21:05:50 -0700
commit833e12f012835f42600f056df355d8f942d5c3b2 (patch)
treeefeb965df329b1dc025ea25ad46cc98dd835e48e
init commit
-rw-r--r--.gitignore175
-rw-r--r--README.md4
-rw-r--r--rasis.py99
3 files changed, 278 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4182b08
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,175 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# UV
+# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+#uv.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+# in version control.
+# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
+.pdm.toml
+.pdm-python
+.pdm-build/
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+# Ruff stuff:
+.ruff_cache/
+
+# PyPI configuration file
+.pypirc
+hashes.txt
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..25b97c5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+# RASIS
+A Fediverse bot that relays information about various arcade games. Pulls from data generated by [573-updates](https://github.com/pinapelz/573-updates)
+
+`@Rasis@social.moekyun.me`
diff --git a/rasis.py b/rasis.py
new file mode 100644
index 0000000..ca8018b
--- /dev/null
+++ b/rasis.py
@@ -0,0 +1,99 @@
+import http.client
+import json
+import hashlib
+import requests
+from dotenv import load_dotenv
+import os
+
+load_dotenv()
+
+
+HASHED_NEWS_FILES = "hashes.txt"
+
+def generate_queued_posts() -> list:
+ def news_already_hashed(line: str) -> bool:
+ try:
+ with open(HASHED_NEWS_FILES, "r") as file:
+ return line in file.read()
+ except FileNotFoundError:
+ with open(HASHED_NEWS_FILES, "w") as file:
+ pass
+ return False
+
+ def append_to_hash_file(line: str):
+ with open(HASHED_NEWS_FILES, "a") as file:
+ file.write(line + "\n")
+ url = "https://arcade-news.pinapelz.com/news.json"
+ response = requests.get(url)
+ queue = []
+ if response.status_code == 200:
+ data = response.json()
+ news_posts = data["news_posts"]
+ for post in news_posts:
+ hash = hashlib.sha256(f"{post['identifier'] + post['content'] + post['date']}".encode('utf-8')).hexdigest()
+ if news_already_hashed(hash):
+ continue
+ queue.append(post)
+ append_to_hash_file(hash)
+ else:
+ print(f"Failed to download JSON. Status code: {response.status_code}")
+ exit(1)
+ return queue
+
+
+def generate_post_content(post_data: dict) -> str:
+ """
+ 📰 GAME - DATE
+ [type] headline?
+ content?
+ 🔗 [link]
+ 🖼 [image?](link)
+ """
+ if "IIDX" in post_data["identifier"]:
+ game = "beatmania IIDX"
+ tags = "#iidx #beatmania #bemani"
+ elif "SOUND_VOLTEX" in post_data["identifier"]:
+ game = "SOUND VOLTEX"
+ tags = "#sdvx #soundvoltex #bemani"
+ elif "CHUNITHM" in post_data["identifier"]:
+ game = "CHUNITHM JPN"
+ tags = "#chunithm"
+ content = f"📰 {game} - {post_data['date']}\n\n"
+ if post_data["type"] is not None:
+ content = content + f"[{post_data['type']}] "
+ if post_data["headline"] is not None and post_data["headline"] != post_data["content"] :
+ content = content + f"[{post_data['headline']}]\n\n"
+ content = content + post_data["content"] + "\n\n"
+ if post_data["url"] is not None:
+ content = content + f"🔗 {post_data['url']}\n"
+ for i in range(len(post_data["images"])):
+ content = content + f"🖼 [Image{i+1}]({post_data['images'][i]['image']})\n"
+ content = content + tags
+ return content
+
+
+def post_on_fedi(content: str):
+ conn = http.client.HTTPSConnection(os.environ.get("SHARKEY_INSTANCE"))
+
+ payload = {
+ "visibility": "public",
+ "text": content,
+ "localOnly": False,
+ "noExtractMentions": False,
+ "noExtractHashtags": False,
+ "noExtractEmojis": False
+ }
+
+ headers = {
+ "Content-Type": "application/json",
+ "Authorization": "Bearer " + os.environ.get("SHARKEY_KEY")
+ }
+ conn.request("POST", "/api/notes/create", json.dumps(payload), headers)
+ res = conn.getresponse()
+ data = res.read()
+
+if __name__ == "__main__":
+ queued_posts = generate_queued_posts()
+ for post in queued_posts:
+ content = generate_post_content(post)
+ post_on_fedi(content)
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage