initial commit

This commit is contained in:
Showdown76 2024-03-02 21:41:56 +01:00
commit 540a61fb45
Signed by: showdown
GPG Key ID: 062A80AA93C13988
11 changed files with 185 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
__pycache__/
.env
database.db

26
bot/app.py Normal file
View File

@ -0,0 +1,26 @@
import discord, asyncio
import os
from discord.ext import commands
from discord import app_commands
import database.controller
intents = discord.Intents.default()
intents.members = True
intents.dm_messages = True
app = commands.Bot(command_prefix=",", intents=intents)
app.db = database.controller.Database("database.db")
# load cogs
async def load_cogs():
for filename in os.listdir("bot/commands"):
if filename.endswith(".py"):
await app.load_extension(f"bot.commands.{filename[:-3]}")
@app.event
async def on_ready():
print("Running")
await load_cogs()
await app.tree.sync()

View File

@ -0,0 +1,32 @@
from database.controller import Database
import discord
from discord import app_commands
from discord.ext import commands
class SubscribeCommand(commands.Cog):
def __init__(self, app: commands.Bot) -> None:
self.app = app
@app_commands.command(
name="subscribe", description="Subscribe to BeReal. notifications."
)
async def subscribe(self, interaction: discord.Interaction) -> None:
result = self.app.db.add_subscriber(interaction.user.id)
if result:
await interaction.response.send_message(
":information_source: You have been subscribed to **BeReal. notifications**\n\
:arrow_right: You will receive every day notifications whenever it's\
time to BeReal.\n:warning: You may unsubscribe at any time using `/unsubscribe`.",
ephemeral=True,
)
else:
await interaction.response.send_message(
":information_source: You are already subscribed to **BeReal. notifications**\
\n:warning: You may unsubscribe at any time using `/unsubscribe`.",
ephemeral=True,
)
async def setup(app: commands.Bot) -> None:
await app.add_cog(SubscribeCommand(app))

View File

@ -0,0 +1,31 @@
import discord
from discord import app_commands
from discord.ext import commands
class UnsubscribeCommand(commands.Cog):
def __init__(self, app: commands.Bot) -> None:
self.app = app
@app_commands.command(
name="unsubscribe", description="Unsubscribe to BeReal. notifications."
)
async def unsubscribe(self, interaction: discord.Interaction) -> None:
result = self.app.db.remove_subscriber(interaction.user.id)
if result:
await interaction.response.send_message(
":information_source: You have been unsubscribed to **BeReal. notifications**\n\
:arrow_right: You will **no longer receive** every day notifications whenever it's\
time to BeReal.\n:warning: You may re-subscribe at any time using `/subscribe`.",
ephemeral=True,
)
else:
await interaction.response.send_message(
":information_source: You are already not subscribed to **BeReal. notifications**\
\n:warning: You may subscribe at any time using `/subscribe`.",
ephemeral=True,
)
async def setup(app: commands.Bot) -> None:
await app.add_cog(UnsubscribeCommand(app))

BIN
database.db.exemple Normal file

Binary file not shown.

8
database/Subscriber.py Normal file
View File

@ -0,0 +1,8 @@
from dataclasses import dataclass
@dataclass
class Subscriber:
id: int
user_id: int
since: str

40
database/controller.py Normal file
View File

@ -0,0 +1,40 @@
import sqlite3
from database.Subscriber import Subscriber
db = sqlite3.connect("database.db")
class Database:
def __init__(self, filename: str) -> None:
db = sqlite3.connect(filename)
def add_subscriber(self, user_id=int):
cursor = db.cursor()
cursor.execute("SELECT user_id FROM subscribers WHERE user_id = ?", (user_id,))
result = cursor.fetchone()
if result:
return False
else:
cursor.execute(
"INSERT INTO subscribers (user_id, since) VALUES (?, DATETIME('now'))",
(user_id,),
)
db.commit()
return True
def get_subscribers(self):
cursor = db.cursor()
cursor.execute("SELECT user_id FROM subscribers")
result = cursor.fetchall()
return [Subscriber(id=row[0], user_id=row[1], since=row[2]) for row in result]
def remove_subscriber(self, user_id=int):
cursor = db.cursor()
cursor.execute("SELECT user_id FROM subscribers WHERE user_id = ?", (user_id,))
result = cursor.fetchone()
if result:
cursor.execute("DELETE FROM subscribers WHERE user_id = ?", (user_id,))
db.commit()
return True
else:
return False

17
main.py Normal file
View File

@ -0,0 +1,17 @@
import os
from dotenv import load_dotenv
load_dotenv()
from bot.app import app
from webserver.webapp import webapp
PORT = os.environ.get("PORT")
@app.listen()
async def on_ready():
app.loop.create_task(webapp.run_task("0.0.0.0", PORT))
app.run(os.environ.get("DISCORD_TOKEN"))

3
requirements.txt Normal file
View File

@ -0,0 +1,3 @@
quart
discord.py
python-dotenv

View File

@ -0,0 +1,19 @@
from quart import Blueprint, render_template, jsonify, request
bereal_time = Blueprint("bereal_time", __name__, template_folder="templates")
@bereal_time.route("/post", methods=["POST"])
async def time_to_bereal():
# May be coming from those IPs:
# 66.228.40.136 (us-east1.dbsrv.net)
# 2600:3c03::f03c:92ff:febe:a263/64
# fe80::f03c:92ff:febe:a263/64
data = await request.get_json()
return {"error": 200, "message": "Success"}
@bereal_time.errorhandler(405)
async def method_not_allowed(e):
return jsonify({"error": 405, "message": "Method not allowed"}), 405

6
webserver/webapp.py Normal file
View File

@ -0,0 +1,6 @@
from quart import Quart
from webserver.page.bereal_time import bereal_time
webapp = Quart(__name__)
webapp.register_blueprint(bereal_time, url_prefix="/time_to_bereal")