import os import discord import yaml import requests from datetime import date from apscheduler.schedulers.background import BackgroundScheduler scheduler = BackgroundScheduler() scheduler.start() from dotenv import load_dotenv load_dotenv() from email.message import EmailMessage import smtplib, ssl # Create a secure SSL context ssl_context = ssl.create_default_context() def load_guilds_data(): with open("guilds.yml", 'r') as stream: try: return yaml.safe_load(stream) except yaml.YAMLError as exc: print(exc) def send_mail(guild, subject, content): msg = EmailMessage() msg['Subject'] = subject msg['From'] = guild['mail_from'] msg['To'] = guild['mailing'] msg.set_content(content) with smtplib.SMTP_SSL(guild['smtp_host'], guild['smtp_port'], context=ssl_context) as server: server.login(guild['smtp_username'], guild['smtp_pass']) server.send_message(msg) def mail_message(message): send_mail(guilds[message.guild.id], f'Nouveau message discord de {message.author.display_name}', f'{message.author.display_name}:\n{message.content}') # Load some data TOKEN = os.getenv('DISCORD_TOKEN') guilds = load_guilds_data() reminder_channels = [] for i in guilds: if 'reminder_channel' in guilds[i]: reminder_channels.append(guilds[i]['reminder_channel']) def erase_framadate (admin_url): x = requests.post(admin_url, headers={'Content-Type': 'application/x-www-form-urlencoded'}, data='remove_all_votes=') if x.status_code != 200: print(x) print(x.content) x = requests.post(admin_url, headers={'Content-Type': 'application/x-www-form-urlencoded'}, data='confirm_remove_all_votes=') @scheduler.scheduled_job('cron', day=25) def cleaner (): for guild_id in guilds: erase_framadate(guilds[guild_id]['framadate_week']) erase_framadate(guilds[guild_id]['framadate_weekend']) # TODO erase calc revenus ? @scheduler.scheduled_job('cron', day=5) async def reminder (): for i in guilds: message = generate_reminder_message(guilds[i]) send_mail(guilds[i], 'La mutunion c’est bientôt !', message) channel = client.get_channel(guilds[i]['reminder_channel']) await channel.send(message) def generate_reminder_message (guild): # If the 10 is weekend sondage = guild['framadate_week'] if date.today().replace(day=10).weekday() > 4: sondage = guild['framadate_weekend'] return f""" Coucou ! Il est l’heure de déclarer ses revenus : <{guild['link_declaration']}> Et d’annoncer à quelle heure vous souhaitez faire la mututu : <{sondage}> Bon début de mois :D Le mutubot """ # Discord API intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_ready(): print(f'{client.user} is connected to the following guild:\n') for guild in client.guilds: print(f'{guild.name} (id: {guild.id})') await reminder() @client.event async def on_message(message): if message.author == client.user: return if message.guild.id not in guilds: return if message.channel.id in guilds[message.guild.id]['mailed_channels']: mail_message(message) # Actually starts the bot client.run(TOKEN)