1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-23 19:44:20 +00:00
This commit is contained in:
Steffo 2017-11-09 20:34:18 +01:00
parent b13da5b176
commit df5f0d89bb
WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
GPG key ID: C27544372FBB445D
5 changed files with 87 additions and 26 deletions

17
db.py
View file

@ -611,13 +611,16 @@ class CVMusic(Base):
@staticmethod
def create_and_add(url: str, user: Royal, enqueued: datetime.datetime, started: datetime.datetime):
session = Session()
session.add(CVMusic(url=url,
enqueued=enqueued,
started=started,
user_id=user.id))
session.commit()
session.close()
try:
session = Session()
session.add(CVMusic(url=url,
enqueued=enqueued,
started=started,
user_id=user.id))
session.commit()
session.close()
except Exception as e:
print(f"ERRORE CVMusic: {e}")
# If run as script, create all the tables in the db
if __name__ == "__main__":

View file

@ -2,6 +2,9 @@ import datetime
import discord
import discord.opus
import functools
import sys
import db
import errors
import youtube_dl
@ -95,6 +98,14 @@ async def find_user(user: discord.User):
user = await loop.run_in_executor(None, session.query(db.Discord).filter_by(discord_id=user.id).join(db.Royal).first)
return user
def on_error(event, *args, **kwargs):
print(f"ERRORE CRITICO NELL'EVENTO `{event}`\n"
f"Il bot si è chiuso per prevenire altri errori.\n"
f"Dettagli dell'errore:\n"
f"{sys.exc_info()}")
sys.exit(1)
@client.event
async def on_message(message: discord.Message):
global voice_queue
@ -130,12 +141,13 @@ async def on_message(message: discord.Message):
else:
voice_client = await client.join_voice_channel(message.author.voice.voice_channel)
await client.send_message(message.channel, f"✅ Mi sono connesso in <#{message.author.voice.voice_channel.id}>.")
elif message.content.startswith("!madd"):
elif message.content.startswith("!play"):
await client.send_typing(message.channel)
# The bot should be in voice chat
if voice_client is None:
await client.send_message(message.channel, "⚠️ Non sono connesso alla cv!\n"
"Fammi entrare scrivendo `!cv` mentre sei in chat vocale.")
return
# Find the sent url
try:
url = message.content.split(" ", 1)[1]
@ -158,14 +170,14 @@ async def on_message(message: discord.Message):
return
if "_type" not in info:
# If target is a single video
video = await Video.init(author=message.author, info=info, timestamp=datetime.datetime.now(), channel=message.channel)
video = await Video.init(author=message.author, info=info, enqueued=datetime.datetime.now(), channel=message.channel)
await client.send_message(message.channel, f"✅ Aggiunto alla coda:", embed=video.create_embed())
voice_queue.append(video)
elif info["_type"] == "playlist":
# If target is a playlist
if len(info["entries"]) < 20:
for single_info in info["entries"]:
video = await Video.init(author=message.author, info=single_info, timestamp=datetime.datetime.now(), channel=message.channel)
video = await Video.init(author=message.author, info=single_info, enqueued=datetime.datetime.now(), channel=message.channel)
await client.send_message(message.channel, f"✅ Aggiunto alla coda:", embed=video.create_embed())
voice_queue.append(video)
else:
@ -177,18 +189,19 @@ async def on_message(message: discord.Message):
if "" in answer.content.lower() or "si" in answer.content.lower():
for single_info in info["entries"]:
video = await Video.init(author=message.author, info=single_info,
timestamp=datetime.datetime.now(), channel=message.channel)
enqueued=datetime.datetime.now(), channel=message.channel)
await client.send_message(message.channel, f"✅ Aggiunto alla coda:", embed=video.create_embed())
voice_queue.append(video)
elif "no" in answer.content.lower():
await client.send_message(message.channel, f" Operazione annullata.")
return
elif message.content.startswith("!msearch"):
elif message.content.startswith("!search"):
await client.send_typing(message.channel)
# The bot should be in voice chat
if voice_client is None:
await client.send_message(message.channel, "⚠️ Non sono connesso alla cv!\n"
"Fammi entrare scrivendo `!cv` mentre sei in chat vocale.")
return
# Find the sent text
try:
text = message.content.split(" ", 1)[1]
@ -208,32 +221,32 @@ async def on_message(message: discord.Message):
video = await Video.init(author=message.author, info=info["entries"][0], enqueued=datetime.datetime.now(), channel=message.channel)
await client.send_message(message.channel, f"✅ Aggiunto alla coda:", embed=video.create_embed())
voice_queue.append(video)
elif message.content.startswith("!mskip"):
elif message.content.startswith("!skip"):
global voice_player
voice_player.stop()
voice_player = None
await client.send_message(message.channel, f"⏩ Video saltato.")
elif message.content.startswith("!mpause"):
elif message.content.startswith("!pause"):
if voice_player is None or not voice_player.is_playing():
await client.send_message(message.channel, f"⚠️ Non è in corso la riproduzione di un video, pertanto non c'è niente da pausare.")
return
voice_player.pause()
await client.send_message(message.channel, f"⏸ Riproduzione messa in pausa.\n"
f"Riprendi con `!mresume`.")
elif message.content.startswith("!mresume"):
elif message.content.startswith("!resume"):
if voice_player is None or voice_player.is_playing():
await client.send_message(message.channel, f"⚠️ Non c'è nulla in pausa da riprendere!")
return
voice_player.resume()
await client.send_message(message.channel, f"▶️ Riproduzione ripresa.")
elif message.content.startswith("!mcancel"):
elif message.content.startswith("!cancel"):
try:
video = voice_queue.pop()
except IndexError:
await client.send_message(message.channel, f"⚠ La playlist è vuota.")
return
await client.send_message(message.channel, f"❌ Rimosso dalla playlist:", embed=video.create_embed())
elif message.content.startswith("!mstop"):
elif message.content.startswith("!stop"):
if voice_player is None:
await client.send_message(message.channel, f"⚠ Non c'è nulla da interrompere!")
return
@ -241,6 +254,28 @@ async def on_message(message: discord.Message):
voice_player.stop()
voice_player = None
await client.send_message(message.channel, f"⏹ Riproduzione interrotta e playlist svuotata.")
elif message.content.startswith("!np"):
if voice_player is None:
await client.send_message(message.channel, f" Non c'è nulla in riproduzione al momento.")
return
voice_queue = []
voice_player.stop()
voice_player = None
await client.send_message(message.channel, f" Ora in riproduzione in <#{voice_client.channel.id}>:", embed=voice_playing.create_embed())
elif message.content.startswith("!queue"):
if voice_player is None:
await client.send_message(message.channel, f" Non c'è nulla in riproduzione al momento.")
return
to_send = ""
to_send += f"0. {voice_playing.info['title'] if voice_playing.info['title'] is not None else '_Senza titolo_'} - <{voice_playing.info['webpage_url'] if voice_playing.info['webpage_url'] is not None else ''}>\n"
for n, video in enumerate(voice_queue):
to_send += f"{n+1}. {video.info['title'] if video.info['title'] is not None else '_Senza titolo_'} - <{video.info['webpage_url'] if video.info['webpage_url'] is not None else ''}>\n"
if len(to_send) >= 2000:
to_send = to_send[0:1997] + "..."
break
await client.send_message(message.channel, to_send)
elif __debug__ and message.content.startswith("!exception"):
raise Exception("sei un mostro")
async def update_users_pipe(users_connection):
@ -256,17 +291,22 @@ async def update_music_queue():
await client.wait_until_ready()
while True:
global voice_player
global voice_playing
# Wait until there is nothing playing
if voice_client is not None and voice_player is not None and (voice_player.is_playing() and not voice_player.is_done()):
await asyncio.sleep(1)
continue
if len(voice_queue) == 0:
if voice_playing is not None:
# Set the playing status
voice_playing = None
await client.change_presence()
await asyncio.sleep(1)
continue
# Get the last video in the queue
video = voice_queue.pop(0)
# Notify the chat of the download
await client.send_message(video.channel, f" E' iniziato il download di:", embed=video.create_embed())
await client.send_message(video.channel, f" E' iniziato il download della prossima canzone.")
# Download the video
await video.download()
# Play the video
@ -274,15 +314,16 @@ async def update_music_queue():
voice_player.start()
# Notify the chat of the start
await client.send_message(video.channel, f"▶ Ora in riproduzione in <#{voice_client.channel.id}>:", embed=video.create_embed())
# Set the playing status
voice_playing = video
await client.change_presence(game=discord.Game(name=video.info.get("title"), type=2))
# Add the video to the db
try:
await loop.run_in_executor(None, functools.partial(video.add_to_db, started=datetime.datetime.now()))
except sqlalchemy.exc.OperationalError:
await client.send_message(video.channel, f"⚠ Ehi, <@77703771181817856>, il database si è rotto. Vallo a sistemare!")
await loop.run_in_executor(None, functools.partial(video.add_to_db, started=datetime.datetime.now()))
def process(users_connection):
print("Discordbot starting...")
loop.create_task(update_users_pipe(users_connection))
loop.create_task(update_music_queue())
client.on_error = on_error
client.run(config["Discord"]["bot_token"])

6
requirements.txt Normal file
View file

@ -0,0 +1,6 @@
discord.py
python-telegram-bot
flask
sqlalchemy
youtube-dl
requests

View file

@ -20,6 +20,17 @@ table.rl {
color: white !important;
}
table.dota {
background-color: #2e2d45 !important;
border: none !important;
padding: 12px !important;
color: white !important;
}
th.dota {
border-bottom: 4px solid #6BF !important;
}
.rl-rank-hidden {
display: none;
}

View file

@ -13,7 +13,7 @@
<h1>
Dota 2
</h1>
<table class="table table-hover sortable">
<table id="dota" class="table table-hover sortable dota">
<thead>
<tr>
<th>Royal</th>
@ -38,7 +38,7 @@
<h1>
Rocket League
</h1>
<table class="table table-hover sortable rl">
<table id="rl" class="table table-hover sortable rl">
<thead>
<tr>
<th>Royal</th>
@ -121,7 +121,7 @@
<h1>
Overwatch
</h1>
<table class="table table-hover sortable">
<table id="overwatch" class="table table-hover sortable">
<thead>
<tr>
<th>Royal</th>
@ -156,7 +156,7 @@
<h1>
Osu!
</h1>
<table class="table table-hover sortable">
<table id="osu" class="table table-hover sortable">
<thead>
<tr>
<th>Royal</th>