From e3bec6bc1140c118711be72a7817a03c8c8f2d6f Mon Sep 17 00:00:00 2001 From: Migatu Date: Mon, 17 Jul 2023 18:27:15 +0200 Subject: [PATCH] Playlist based on chat history --- bot.py | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 94 insertions(+), 5 deletions(-) diff --git a/bot.py b/bot.py index d75113f..08a47f6 100644 --- a/bot.py +++ b/bot.py @@ -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/R0915) # 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 operation on music library. @@ -773,7 +805,10 @@ async def wyszukaj(ctx, how_many=0): """ # TODO: Potem dorobić wyszukiwania po kawałkach słów # 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") search_weight = [] for _ in range(len(music_file_list)): @@ -1489,7 +1524,12 @@ async def get_image_stable_diffusion(ctx): 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): """ 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 the `get_image """ - + stats = {} 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