From ea95c92fb92f2cd720a92624194e0caaa98cfc5f Mon Sep 17 00:00:00 2001 From: jkkicks <99859706+jkkicks@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:45:34 -0700 Subject: [PATCH] onboard via embed in #welcome --- main.py | 138 +++++++++++++++++++++++--------------------------------- 1 file changed, 57 insertions(+), 81 deletions(-) diff --git a/main.py b/main.py index 5c861da..c09a41d 100644 --- a/main.py +++ b/main.py @@ -1,111 +1,87 @@ import discord from discord.ext import commands -import sqlite3 -from dotenv import load_dotenv import os +from dotenv import load_dotenv +import sqlite3 import logging -from datetime import datetime +from datetime import datetime, timezone -# Set up logging handler. Passed in at the end in bot.run -handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w') - -# Load ENV file +# Load environment variables load_dotenv() -# Gather variables from .env file -BOT_TOKEN = os.getenv('BOT_TOKEN') -CHANNEL_ID = int(os.getenv('BOT_CHANNEL_ID')) -botCommandsEnable = True - -if BOT_TOKEN is None: - print("BOT TOKEN NOT FOUND IN ENV") - exit() -if CHANNEL_ID is None: - print("NO CHANNEL SELECTED, DISABLING BOT COMMANDS") - botCommandsEnable = False -else: - print(f'Channel ID selected: {CHANNEL_ID}') - +# Setup logging +logging.basicConfig(filename='discord.log', level=logging.INFO) +# Define intents intents = discord.Intents.all() -intents.members = True # Enable the member update intent -intents.message_content = True # Enable the Privileged Content intent -# Set discord end bot commands to / prefix -bot = commands.Bot(command_prefix='/', intents=intents) - -# Connect to SQLite +# Connect to SQLite database conn = sqlite3.connect('member_data.db') -cursor = conn.cursor() +c = conn.cursor() + +# Create table if not exists +c.execute('''CREATE TABLE IF NOT EXISTS members + (user_id INTEGER PRIMARY KEY, username TEXT, nickname TEXT, join_datetime TEXT, onboarding_status INTEGER, last_change_datetime TEXT)''') -# Create Dataset if it doesn't exist already -cursor.execute(''' - CREATE TABLE IF NOT EXISTS members ( - user_id INTEGER PRIMARY KEY, - username TEXT, - nickname TEXT, - join_date TEXT - ) -''') conn.commit() +# Initialize bot +bot = commands.Bot(command_prefix='/', intents=intents) @bot.event async def on_ready(): - # When API connects and logs in. - print(f'Bot logged in as {bot.user.name}') + print(f'Logged in as {bot.user}') - # Send help command to bot-commands channel - # channel = bot.get_channel(int(CHANNEL_ID)) - # await channel.send(f'Use /help to view available commands') + # Find the #welcome channel + welcome_channel_id = int(os.getenv('WELCOME_CHANNEL_ID')) + welcome_channel = discord.utils.get(bot.get_all_channels(), id=welcome_channel_id) + + # Check if welcome message has already been sent in the channel + async for message in welcome_channel.history(limit=100): + if message.author == bot.user and message.embeds: + return # If the welcome message is found, exit the function + + # Send welcome message in the #welcome channel + view = discord.ui.View() + button = discord.ui.Button(label="Complete Onboarding") + view.add_item(button) + embed = discord.Embed(title="Welcome to the Server!", description="Here's how to get started:") + embed.add_field(name="Step 1:", value="Read the server rules in #rules channel.") + embed.add_field(name="Step 2:", value="Check out people's projects.") + embed.add_field(name="Step 3:", value="Complete Onboarding procedure to unlock the rest of the server.") + embed.set_footer(text="Enjoy your stay!") + await welcome_channel.send(embed=embed, view=view) @bot.event async def on_member_join(member): - # Print user's name and ID in the console on new join - print(f'New member joined: {member.name} (ID: {member.id}), joined at {member.joined_at}') - print(member) + # Check if member already exists in the database + c.execute("SELECT * FROM members WHERE user_id = ?", (member.id,)) + existing_member = c.fetchone() - # Store member data in the database - cursor.execute('INSERT INTO members (user_id, username, join_date) VALUES (?, ?, ?)', - (member.id, member.name, datetime.now().strftime('%Y-%m-%d %H:%M:%S'))) - conn.commit() - - -@bot.command() -async def commands(ctx): - avail_commands = open("availcommands.txt", "r") - await ctx.send(avail_commands.read()) - avail_commands.close() - - -@bot.command() -async def setnick(ctx, new_nickname: str): - - # Update user's nickname in the database - cursor.execute('UPDATE members SET nickname = ? WHERE user_id = ?', (new_nickname, ctx.author.id)) + if not existing_member: # If it's the member's first time joining + # Add new member to the database + c.execute( + "INSERT OR REPLACE INTO members (user_id, username, join_datetime, onboarding_status, last_change_datetime) VALUES (?, ?, ?, ?, ?)", + (member.id, member.name, member.joined_at.isoformat(), 0, datetime.now(timezone.utc).isoformat())) conn.commit() - # Retrieve the updated nickname from the database - cursor.execute('SELECT nickname FROM members WHERE user_id = ?', (ctx.author.id,)) - updated_nickname = cursor.fetchone()[0] + # Update member nickname + await member.edit(nick=c.execute("SELECT nickname FROM members WHERE user_id = ?", (member.id,)).fetchone()[0]) - # Print the updated nickname to the console - print(f'Nickname updated for {ctx.author.name} (ID: {ctx.author.id}): {updated_nickname}') + # Log member join + logging.info(f'Member {member.name} joined the server.') - member = ctx.guild.get_member(ctx.author.id) - if member: - try: - await member.edit(nick=updated_nickname) - print(f'Nickname updated on the server for {ctx.author.name}') - except discord.Forbidden: - print(f'Failed to update nickname on the server for {ctx.author.name}: Missing permissions') - except discord.HTTPException as e: - print(f'Failed to update nickname on the server for {ctx.author.name}: {e}') -# Close the database connection when the bot is stopped @bot.event -async def on_disconnect(): - conn.close() +async def on_member_remove(member): + # Log member leave + logging.info(f'Member {member.name} left the server.') -bot.run(BOT_TOKEN, log_handler=handler, log_level=logging.DEBUG) + +# Load bot token and welcome channel id from .env file +TOKEN = os.getenv('BOT_TOKEN') +WELCOME_CHANNEL_ID = os.getenv('WELCOME_CHANNEL_ID') + +# Start bot +bot.run(TOKEN)