quotes-bot/bot.py
2024-12-02 08:18:47 +00:00

123 lines
3.8 KiB
Python

import discord
from discord import app_commands
import requests
import random
from datetime import datetime
from dotenv import load_dotenv
import os
# Load environment variables from .env
load_dotenv()
# Fetch token and URL from .env
DISCORD_TOKEN = os.getenv('DISCORD_TOKEN')
QUOTES_URL = os.getenv('QUOTES_URL')
# Function to fetch quotes from the URL
def fetch_quotes():
response = requests.get(QUOTES_URL)
if response.status_code == 200:
return response.json()
return None
# Function to get all quotes from the fetched data
def get_all_quotes(data):
all_quotes = [] # List to hold all quotes
for entry in data['cytaty']:
for quote in entry['quotes']:
all_quotes.append({
'quote': quote['quote'],
'user': quote['user'],
'author': quote.get('author', "Unknown"),
'date': entry['date']
})
return all_quotes
# Bot setup
intents = discord.Intents.default()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
# Load quotes when the bot starts
all_quotes = []
# Event when bot is ready
@client.event
async def on_ready():
global all_quotes
# Sync commands again
await tree.sync() # Sync global commands
for guild in client.guilds:
await tree.sync(guild=discord.Object(id=guild.id)) # Sync guild-specific commands if any
data = fetch_quotes()
if data:
all_quotes = get_all_quotes(data)
print(f'Logged in as {client.user}')
print("Commands synced")
else:
print("Failed to fetch quotes on startup")
# Slash command for fetching the quote of the day
@tree.command(name="quote", description="Get the quote of the day based on the current date")
async def fetch_quote(interaction: discord.Interaction):
global all_quotes
# Acknowledge the interaction immediately
await interaction.response.defer(thinking=True)
if all_quotes:
total_quotes = len(all_quotes)
# Calculate the index based on the current date
current_date = datetime.now()
epoch_start = datetime(1970, 1, 1) # Unix epoch start date
days_since_epoch = (current_date - epoch_start).days
# Calculate the quote index
quote_index = days_since_epoch % total_quotes
quote_data = all_quotes[quote_index]
user = quote_data['user']
quote = quote_data['quote'].replace("<br>", "\n") # Replace <br> with new lines
author = quote_data['author']
date = quote_data['date']
# Format response message
response_message = (
f"**Quote of the Day**:\n> {quote}\n- Autor tego cuda: {author} (Wysłane przez: {user})\n*Data: {date}*"
)
await interaction.followup.send(response_message)
else:
await interaction.followup.send("No quotes available.")
# Slash command for fetching a random quote
@tree.command(name="random_quote", description="Get a random quote")
async def random_quote(interaction: discord.Interaction):
global all_quotes
# Acknowledge the interaction immediately
await interaction.response.defer(thinking=True)
if all_quotes:
quote_data = random.choice(all_quotes) # Select a random quote
user = quote_data['user']
quote = quote_data['quote'].replace("<br>", "\n") # Replace <br> with new lines
author = quote_data['author']
date = quote_data['date']
# Format response message
response_message = (
f"**Random Quote**:\n> {quote}\n- Autor tego cuda: {author} (Wysłane przez: {user})\n*Data: {date}*"
)
await interaction.followup.send(response_message)
else:
await interaction.followup.send("No quotes available.")
# Run the bot with the token from the .env file
client.run(DISCORD_TOKEN)