Playlist based on chat history

This commit is contained in:
2023-07-17 18:27:15 +02:00
committed by migatu
parent aa00045dec
commit e3bec6bc11
+94 -5
View File
@@ -756,10 +756,42 @@ async def async_iterator_generator(range_of_iterable):
""" """
async def get_stats(ctx, history_limit):
"""
The `get_stats` function retrieves the message history of a specific channel and counts the
frequency of each word in the messages.
:param ctx: The `ctx` parameter is an object that represents the context of the command being
executed. It contains information such as the message, the author, the server, and other relevant
details
:param history_limit: The `history_limit` parameter is the maximum number of messages to retrieve
from the channel history. It determines how far back in time the statistics will be calculated
:return: The function `get_stats` returns a dictionary `stats` that contains the frequency count of
words found in the messages from the specified channel.
"""
channel_id = 1062047367337095268
async with ctx.typing():
stats = {}
channel = client.get_channel(channel_id)
messages = [message async for message in channel.history(limit=history_limit)]
# traverse the iterable of awaitables
for message in messages:
# await and get the result from the awaitable
result = message.content
words = result.split()
for word in words:
if word in stats:
stats[word] += 1
else:
stats[word] = 1
for name, how_many in stats.items():
yield name, how_many
# trunk-ignore(pylint/R0914) # trunk-ignore(pylint/R0914)
# trunk-ignore(pylint/R0915) # trunk-ignore(pylint/R0915)
# trunk-ignore(pylint/R0912) # trunk-ignore(pylint/R0912)
async def wyszukaj(ctx, how_many=0): async def wyszukaj(ctx, how_many=0, slowa_kluczowe=None):
""" """
Take in a context object and an optional integer parameter "how_many" and perform search Take in a context object and an optional integer parameter "how_many" and perform search
operation on music library. operation on music library.
@@ -773,7 +805,10 @@ async def wyszukaj(ctx, how_many=0):
""" """
# TODO: Potem dorobić wyszukiwania po kawałkach słów # TODO: Potem dorobić wyszukiwania po kawałkach słów
# i sieć neuronową z możliwością wyrażenia opinii o dopasowaniu. # i sieć neuronową z możliwością wyrażenia opinii o dopasowaniu.
word_list = ctx.message.content.split() if slowa_kluczowe:
word_list = slowa_kluczowe
else:
word_list = ctx.message.content.split()
logger.info("Wyszukuje") logger.info("Wyszukuje")
search_weight = [] search_weight = []
for _ in range(len(music_file_list)): for _ in range(len(music_file_list)):
@@ -1489,7 +1524,12 @@ async def get_image_stable_diffusion(ctx):
pass pass
# @client.hybrid_command() # trunk-ignore(mypy/arg-type)
@client.hybrid_command(
name="zagraj_muzyke_mego_ludu",
description="Gra muzyke wyszukana na bazie tematow konwersacji na kanale NZ",
guild=discord.Object(id=664789470779932693),
)
async def zagraj_muzyke_mego_ludu(ctx): async def zagraj_muzyke_mego_ludu(ctx):
""" """
Play completeley random playlist based on messaging history. Play completeley random playlist based on messaging history.
@@ -1499,9 +1539,58 @@ async def zagraj_muzyke_mego_ludu(ctx):
channel, the author, and other relevant details. In this case, it is being passed as a parameter to channel, the author, and other relevant details. In this case, it is being passed as a parameter to
the `get_image the `get_image
""" """
stats = {}
if ctx: if ctx:
pass stat_iter = get_stats(ctx, 100)
async for name, how_many in stat_iter:
if len(name) > 3:
stats[name] = how_many
sorted_stats = sorted(stats.items(), key=lambda x: x[1])
sorted_stats = list(reversed(sorted_stats))
print(sorted_stats)
reply = "Wygenerowana plejlista:\n"
async with ctx.typing():
logger.info("Zaczynam szukać timestamp %s", datetime.now())
search_time_glob = datetime.now()
file = await wyszukaj(ctx=ctx, how_many=100, slowa_kluczowe=sorted_stats[:30])
logger.info(
"Koniec szukania(timestamp %s zajęło %s",
datetime.now(),
datetime.now() - search_time_glob,
)
index = 1
if file:
for plik in file:
global MUZYKA # pylint: disable=global-variable-not-assigned
MUZYKA["queue"].insert(0, plik[1])
MUZYKA["requestor"].insert(0, ctx.author)
metadata = eyed3.load(plik[1])
if metadata and metadata.tag:
if metadata.tag.title:
reply += f"{index} {metadata.tag.title}"
else:
reply += f"{index}. {plik[1]} z prywatnej kolekcji Hammera."
if metadata.tag.artist:
reply += f" wykonawcy {metadata.tag.artist}"
if metadata.tag.album:
reply += f" z albumu {metadata.tag.album}"
if metadata.tag.title:
reply += " z prywatnej kolekcji Hammera i na Twoją specjalną rpośbę.\n"
else:
reply += f"{index}. {plik[1]} z prywatnej kolekcji Hammera."
index += 1
if len(reply) > 1800:
await ctx.send(reply)
reply = ""
else:
await ctx.send(
"Obawiam się że nie mogę nic znaleźć u siebie. Spróbuj komendy '$dej_co_ze_spotifaja' jeśli masz link"
)
await ctx.send(reply)
logger.info("Plejlista zrobiona")
# *================================== Run # *================================== Run