Discord Bot - "say" command

  • VB.NET
  • .NET 4.5

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    Discord Bot - "say" command

    Hey!

    Ich arbeite derzeit an einen Discord Bot in VB.NET und wollte einen "say" command einfügen,
    heißt wenn jemand "!say hallo" in den Chat eingibt, soll der Bot "hallo" wiedergeben.

    Das habe ich zuerst damit versucht:

    VB.NET-Quellcode

    1. ​Dim say As String


    das ging nicht dann habe ich es damit versucht:

    VB.NET-Quellcode

    1. ​Dim arg As String = msg.Split(" ")(1)


    Jedoch klappt das auch nicht,
    der Code für die Commands lautet:

    VB.NET-Quellcode

    1. Private Async Function onMessage(message As SocketMessage) As Task
    2. If message.Source <> MessageSource.Bot And message.Content.StartsWith(prefix) Then
    3. If message.Content.StartsWith(prefix & "say" + arg oder say) And DirectCast(message.Author, SocketGuildUser).Roles.ToList.Contains(DirectCast(message.Channel, IGuildChannel).Guild.GetRole(adminRole)) Then
    4. Await message.Channel.SendMessageAsync(arg oder say)
    5. End If
    6. End If
    7. End Function


    (prefix steht für das ! - was vor dem Discord Befehl kommt um ihn auszuführen).

    In den Klammern steht "arg oder say" da ich es ja schon versucht habe, jedoch hat es ja nicht geklappt..
    Ich hoffe mir kann jemand helfen, um nochmal klarzustellen, ich möchte das der Bot einen beliebigen Text von mir wiederholt.

    Vielen Dank im Voraus!

    opalutsch schrieb:

    VB.NET-Quellcode

    1. Dim arg As String = msg.Split(" ")(1)
    Ich hoffe, Dir ist bewusst, dass Indizes in .NET null-basiert sind,
    das bedeutet, dass Du hier den zweiten Teilstring bekommst, so vorhanden.
    Bevor Du hier mit Async und Co operierst, lass das Programm per Button_Click einfach ein paar vorgefertigte Worte sprechen, damit Du das Handling korrekt implementieren kannst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    opalutsch schrieb:

    (prefix & "say" + arg oder say)


    opalutsch schrieb:

    (arg oder say)


    Das dürfte eigentlich gar nicht kompilieren.

    Und es passiert doch sicherlich nicht "nichts" irgendwas muss ja passieren.

    Schon mal geschaut ob überhaupt etwas in message.Content drin steht?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @RodFromGermany

    Vorgefertigte Worte will ich ja nicht, sondern ich möchte das wenn ich in den Discord Chat z.B "!say hallo" eingebe, dass er dann auch "hallo" wiedergibt,
    wenn ich Dim test As String = "Hallo" mache und dann test calle dann wiedergibt er nachdem ich "!say" eingebe ja "Hallo" und nicht das was ich eigentlich will..

    Vollzitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Was kommt denn tatsächlich als message.content an? Denn wenn "!say test", dann wird StartsWith(prefix & "say" + arg oder say) allein schon daran scheitern, dass da ein Leerzeichen fehlt. StartsWith(prefix & "say " + arg oder say) wäre wohl richtig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich hatte nach "say" schon ein Leerzeichen also "say ", habe es hier nur weggemacht.


    VaporiZed schrieb:

    Was kommt denn tatsächlich als message.content an?

    Das kommt raus wenn ich es so mache:

    VB.NET-Quellcode

    1. Dim arg As String = msg.Split(" ")(1)


    VB.NET-Quellcode

    1. Private Async Function onMessage(message As SocketMessage) As Task
    2. If message.Source <> MessageSource.Bot And message.Content.StartsWith(prefix) Then
    3. If message.Content.StartsWith(prefix & "say " + arg) And DirectCast(message.Author, SocketGuildUser).Roles.ToList.Contains(DirectCast(message.Channel, IGuildChannel).Guild.GetRole(adminRole)) Then
    4. Await message.Channel.SendMessageAsync(arg)
    5. End If
    6. End If
    7. End Function


    Ich sehe hier in deiner Funktion nirgends das du message.Content der Variable msg zuweist um dann überhaupt etwas sinnvolles in arg zu haben.

    Prüfe doch nur auf "!say" ist das erfolgreich mach halt entweder nen .Replace("!say ", "") somit hast du nur noch das argument.
    Denn wenn du nach leerzeichen splittest dann hast du jedes mal ein neuen Eintrag wenn dabei ein leerzeich in der nachricht vorkommt.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Ist ja dann klar das du alles zurück bekommst.
    Du musst natürlich auch das !say entfernen.

    Ich würde das so machen:

    VB.NET-Quellcode

    1. Private Async Function onMessage(message As SocketMessage) As Task
    2. If message.Source <> MessageSource.Bot And message.Content.StartsWith(prefix) Then
    3. If message.Content.StartsWith("!say ") And DirectCast(message.Author, SocketGuildUser).Roles.ToList.Contains(DirectCast(message.Channel, IGuildChannel).Guild.GetRole(adminRole)) Then
    4. Dim messageToSend as String = message.Content.Replace("!say ", "")
    5. Await message.Channel.SendMessageAsync(messageToSend)
    6. End If
    7. End If
    8. End Function
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    opalutsch schrieb:

    will ich ja nicht
    Aber Du willst, dass Dein Programm funktioniert.
    Du setzt da mehrere Programm-Blöcke zusammen, ohne dass Du weißt, dass alle richtig funktionieren.
    Du musst jeden Block einzeln implementieren und testen. Erst wenn es klappt, werden sie zusammengesetzt! 8o
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich hoffe du weißt auch warum es nun klappt, und weißt warum es vorher nicht geklappt hat.
    Normalerweise gibt es hier nicht so schnell funktionierende Code da man die Fehler verstehen soll.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen