0
votes

Existe-t-il un moyen d'arrêter un discordant.py bot de faire une action de répétition si cela a été fait au cours des X dernières secondes?

J'ai actuellement un bot qui pive les gens si certains critères sont remplis. Le problème est que le bot ping spam si le contenu est répété. Par exemple, disons que l'utilisateur Johnsmith # 1234 dit "Ping Me si quelqu'un dit" Apple "ou" Pommes "dans le chat." Ça va le faire. Cependant, dites 4 messages en succession rapide:

user1: "Hé, aimez-vous les pommes?"

user2: "Ouais, j'aime les pommes"

user1: "Quel est votre type de pomme préféré?"

user2: "Je n'ai pas vraiment de pomme préférée, mais j'aime maman Smith"

Puis le bot dira:

@ johnsmith # 1234 pour "pomme"

@ johnsmith # 1234 pour "pomme"

@ johnsmith # 1234 pour "pomme"

@ johnsmith # 1234 pour "pomme"

Parce que "Apple" a été mentionné 4 fois. Existe-t-il un moyen de dire au bot "si vous avez pingé Johnsmith # 1234 au cours des 10 dernières secondes, ne le pingez-vous pas à nouveau?" Je veux fondamentalement une action pour ne pas exécuter si cela a été fait récemment.

EDIT:

Alors que les réponses montrées semblent fonctionner pour un seul utilisateur, ils ne semblent pas fonctionner pour plusieurs. Les réponses vont accueillir Johnsmith # 1234 très bien, mais à ce moment-là, cela rendra le bot inutile jusqu'à ce que le retard de Johnsmith # 1234 soit fait.

Je ne sais pas comment dire à The Bot "Continuez à faire ce que vous faites, mais exécutez la boucle de retard sur le côté." Voici ce que le bot fait actuellement, continuant de l'exemple que j'ai fourni précédemment:

1: Dites @ johnsmith # 1234 pour 'Apple'

2: met John Smith dans un dictionnaire d'attente jusqu'à 10 secondes. (Remarque: le bot ne fera rien d'autre que d'attendre. C'est mauvais parce qu'il devrait ping d'utilisateurs à part John Smith).

3: Si ces 10 secondes sont en place, cela ping John Smith à nouveau. Sinon, cela continuera à faire des choses pour les autres utilisateurs.


0 commentaires

3 Réponses :


1
votes

Créer un dictionnaire de recharge où vous pouvez stocker des personnes que le bot a déjà été pingé et la fin du temps de recharge. Ex: Cooldows = {"Johnsmith # 1234": 1597786825} .

Puis, lorsque votre bot tente de ping quelqu'un, vérifiez si elles sont dans le dictionnaire. S'ils vérifient l'époque Timestamp, si l'heure est maintenant supérieure à celle indiquée, supprimez l'utilisateur du dictionnaire et de le ping, si ce n'est pas ne les ping pas. S'ils ne sont pas dans le dictionnaire, le bot peut les ping


4 commentaires

Semble être ce que je cherche. Je n'ai jamais utilisé de temps d'époque, cependant; Comment devrais-je faire ça?


Utilisation du module de temps Utilisez le temps.Time () Cela renvoie un certain nombre de secondes passées depuis le 1er janvier 1970. Utilisez ce numéro pour vérifier la quantité de secondes de refroidissement.


Juste, mais comment puis-je réellement cela? Je ne sais pas comment comparer deux fois à l'aide du module Time.


Ils viennent de retourner un numéro que vous pouvez comparer en utilisant> <= etc.



1
votes

Vous pouvez faire un dictionnaire qui suivra quand les gens ont posté leur message, chaque fois qu'un utilisateur type "Apple", vous pouvez ajouter leur nom au dictionnaire suivi de la date et de l'heure actuelles.

Vous pouvez obtenir la date actuelle et temps en utilisant ce code: xxx

Votre dictionnaire ressemblera à ceci comme suit: xxx

Vous pouvez ensuite ajouter des utilisateurs en utilisant ce code: xxx

une fois que vous avez tout ce que vous pouvez exécuter un chèque pour voir si le message a été envoyé dans les 10 secondes suivant l'horodatage, s'il était alors pas Ne faites rien, sinon envoyez la mention: xxx


5 commentaires

Juste, mais comment puis-je faire ce chèque?


Trouvez l'utilisateur dans le dictionnaire, puis utilisez une instruction IF pour vérifier si le nouvel horodatage est 10 secondes avant leur horodatage.


Je devrais reformuler: Je ne connais pas très bien le module de temps, je ne sais donc pas comment vérifier si un horodatage est X secondes avant l'autre horodatage. Est-ce juste l'horodatage + 10?


Merci. Y a-t-il un moyen de ne pas utiliser la boucle tandis que? Il utilise un tas de puissance de traitement et fait tout ce qui est lent. EDIT: On dirait que cela ne gère rien d'autre que la boucle tandis que la boucle est terminée; Comme cela doit être fait pour plusieurs utilisateurs, ce n'est pas vraiment une option que je peux utiliser


C'est juste un exemple, dans votre code actuel au lieu d'utiliser une boucle, vérifiez simplement si DateTime



0
votes

J'ai compris une méthode qui a fonctionné avec mon bot. Il repose sur le module de filetage. Voici le code de base:

import threading

global Username
global Username_ID
global Username_mention
global Username_ping
Username= []
Username_ID = XXXXXXXXXXXXXXXXXX #each X is a number. Used to actually ping people, since Discord Nitro lets people customize their mentions
Username_mention = 'Username#XXXX'
Username_ping = True

def Username_timer_func():

    global Username_ping
    Username_ping = True
    #note: the following step is optional. Useful for bug checking
    print("Username can be pinged again")

Username_timer = threading.Timer(30, Username_timer_func)
global Username_ping

if bool(in_Username) == True and bool(Username_ping) == True and str(message.author) != Username_mention:
            await channel.send("<@"+ str(Username_ID)+">" + " for "+ str(set(<list of words in the message, e.g. apple>) & set(Username))[1:][:-1])
            Username_ping = False
            Username_timer.start()


0 commentaires