Files
BotNoticias/main.py
binlab d31540514a
Some checks failed
Update Bot / restart-bot (push) Has been cancelled
Update Bot / deploy-via-sftp (push) Has been cancelled
problema con ids
2025-10-27 09:35:02 +01:00

101 lines
3.3 KiB
Python
Executable File

import requests
import discord
from discord.ext import commands
from discord.ext import tasks
import os
import time
import xmltodict
intents = discord.Intents.all()
allowed_mentions = discord.AllowedMentions(everyone = True)
bot = commands.Bot(command_prefix="$", intents=intents, allowed_mentions=allowed_mentions)
url = "https://www.infodefensa.com/sitemap/lastarticles"
r = requests.get(url)
xml = xmltodict.parse(r.text)
ultimaurl = xml['urlset']['url'][0]['loc'] #Guarda la última url del xml
#viejoxml = xml['urlset']['url'][0]['loc'] #Guarda la primera url del xml al encender el bot
@bot.event
async def on_ready():
print(f"Bot vivo! \nUsuario: {bot.user}")
await bot.user.edit(username="Pregonero")
await bot.change_presence(
status=discord.Status.online,
activity=discord.Activity(
type=discord.ActivityType.playing,
name="Pregoneando"))
await send_log(f"hora de inicio: {time.ctime(time.time())}")
mandar_noticia.start()
async def send_log(msg): #Mandar log
channel = bot.get_channel(int(os.environ["IDcanalLogs"])) #Canal al que se envía el log
await channel.send(msg)
@tasks.loop(minutes = 5) #Mandar noticias
async def mandar_noticia():
global ultimaurl
try:
channel = bot.get_channel(int(os.environ["IDcanalNoticias"])) #Canal al que se envía el mensaje
r = requests.get(url)
xml = xmltodict.parse(r.text)
urls = [u['loc'] for u in xml['urlset']['url']] #Lista de todas las URL
nuevas = []
for loc in urls:
if loc == ultimaurl:
break
nuevas.append(loc)
if nuevas: #Si el array no está vacío
await channel.send(f"Atención <@&{int(os.environ['IDRol'])}> hay nuevas noticias:") #Luego hay que cambiar el rol
for loc in reversed(nuevas): #Recorre el array hacia atrás para mandarlas en orden.
await channel.send(f"\n{loc}")
ultimaurl = urls[0] #Actualizamos la url vieja
except Exception as e:
await send_log(f"Error: ```{e}```")
@bot.command()
async def noticias(ctx):
rol = ctx.guild.get_role(int(os.environ["IDRol"]))
user = ctx.author
if rol in user.roles:
await user.remove_roles(rol)
await ctx.send(f"Entendido {user.mention}, ya no recibirás las noticias", delete_after=5)
else:
await user.add_roles(rol)
await ctx.send(f"Entendido {user.mention}, ahora recibirás las noticias", delete_after=5)
#Versión antígua, sólo comprobaba la última URL y pierde info si se suben varias a la vez
#@tasks.loop(minutes = 5) #Mandar noticias
#async def mandar_noticia():
# global viejoxml
# try:
# channel = bot.get_channel(secrets.IDcanalNoticias) #Canal al que se envía el mensaje
# r = requests.get(url)
# xml = xmltodict.parse(r.text)
# nuevoxml = xml['urlset']['url'][0]['loc'] #Guarda la primera url del xml
# if nuevoxml != viejoxml: #Compara las url
# await channel.send(f"Atención <@&{secrets.IDrol}> hay una nueva noticia:\n{xml['urlset']['url'][0]['loc']}") #Luego hay que cambiar el rol
# viejoxml = nuevoxml #Actualizamos la url vieja
# except Exception as e:
# await send_log(f"Error: ```{e}```")
if __name__ == '__main__':
bot.run(os.environ["TOKEN"])