Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

1

10.04.2017, 15:37

C# Discord Bot Nullpointer beim Suchen des Servers

Hi,
ich bin grade am Discord Bot für den Discord Server des Forums dran. Ich bekomme noch einen Nullpointer, es sei für den Verweis keine Objektinstanz festgelegt.

Damit der Bot bei Events etwas posten kann, muss er den Server suchen, damit er sich die Lobby raussuchen kann und dort schreiben kann. Server und Lobby haben eine ID. Ich kann also schreiben

C#-Quelltext

1
Channel lobby = client.GetServer(serverId).GetChannel(lobbyId);
Interessanterweise schmeißt er den Nullpointer bei

C#-Quelltext

1
client.GetServer(serverId);
Mit dem Debugger konnte ich das mal per

C#-Quelltext

1
Server s = client.GetServer(serverId);
testen. Server- und LobbyId habe ich schon abgeglichen, die müssten stimmen.

Vielleicht gibt es ja auch ein anderes Problem, ich komme grade nicht drauf. Events habe ich in einer separaten Klasse, ebenfalls Commands, damit man den Bot in Zukunft kräftig erweitern kann, falls gewünscht. Es wäre super, wenn jemand sich mal hier den Ausschnitt angucken kann und mir sagen kann, wieso er sich nicht den Server holen kann.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 internal class Bot
    {
        public Bot() // Der Haupteinstiegspunkt
        {
            var client = new DiscordClient();
 
            client = new DiscordClient(x =>
            {
                x.LogLevel = LogSeverity.Info;
            });
 
            client.UsingCommands(x =>
            {
                x.PrefixChar = '!';
                x.AllowMentionPrefix = true;
            });
 
            new EventStore(client, serverId, adminId, lobbyId);     // Alle Events sind dort hinterlegt
 
            new CommandStore(client, serverId);     // Alle Commands sind dort hinterlegt
 
            client.ExecuteAndWait(async () =>
            {
                while (true)
                {
                    await client.Connect(token, TokenType.Bot);
                    break;
                }
            });
        }
 
        string token = /* der Token des Bots */;
        ulong adminId = /* adminId */;
        ulong serverId = /* serverId */;
        ulong lobbyId = /* lobbyId */;
    }
 





    internal class CommandStore // Sammlung der Commands
    {
        public CommandStore(DiscordClient client, ulong serverId)
        {
            service = client.GetService<CommandService>();
            server = client.GetServer(serverId); // Server anhand von Id selektieren - !! NullReferenceException !!

            Help();
            // Andere Commands ...
        }
 
        private CommandService service;
        private Server server;

        private void Help()
        {
            service.CreateCommand("help").Do(async (e) =>
            {
                await e.User.SendMessage("hilfetext");
            });
        }
    }





 
    internal class EventStore // Sammlung der Events
    {
        public EventStore(DiscordClient discordClient, ulong serverId, ulong idAdmin, ulong lobbyId)
        {
            client = discordClient;
            lobby = client.GetServer(serverId).GetChannel(lobbyId); // Server -> LobbyChannel anhand von Id selektieren - !! NullReferenceException !!

            UserJoined();
            // Andere Events ...
        }
 
        private DiscordClient client;
        private Channel lobby;
 
        private void UserJoined() // Neuer User auf dem Server
        {
            client.UserJoined += async (s, e) =>
            {
                 await lobby.SendMessage("irgendeine Nachricht");
            };
        }
    }

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Garzec« (10.04.2017, 16:23)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

10.04.2017, 19:37

Ich würde vermuten das du auf die Informationen über Server und Lobbies erst zugreifen kannst wenn der Client verbunden ist. Im Constructor deiner *Store Klassen greifst du aber schon drauf zu bevor du überhaupt das connect aufgerufen hast.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

10.04.2017, 19:45

Zeilen 18 und 20 sehen auch komisch aus. Da erzeugst du neue Objekte, aber speicherst die Referenz nirgendwo. Ist das gewollt?

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

4

10.04.2017, 21:51

@David, ja ich weiß, sieht komisch aus, aber ich brauche die Instanz nirgends :O Ich erzeuge die Events und Commands ja eh im Konstruktor. Und ich dachte, da ich dann ja nichts mehr mit der Instanz mache, brauche ich auch keine ...

Habs aber auch schonmal mit Instanz getestet, daran liegt es nicht.

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

5

10.04.2017, 22:07

Debugge dich mal durch die Schritte und prüfe was wann wo null wird.

C#-Quelltext

1
2
3
4
5
6
7
8
public CommandStore(DiscordClient client, ulong serverId)
{
     service = client.GetService<CommandService>();
     server = client.GetServer(serverId); // Server anhand von Id selektieren - !! NullReferenceException !!

     Help();
     // Andere Commands ...
}


Ich vermute, dass an der Stelle client null ist? Schau mal ob der Konstruktor überhaupt mit einem korrekten wert aufgerufen wird.
Das selbe gilt für den EventStore

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

6

11.04.2017, 07:35

@Wirago, genau da liegt das Problem, der Client ist nicht null, der Client ist korrekt vorhanden.

Würde ich also schreiben

C#-Quelltext

1
2
this.client = client; // Wert wird korrekt gesetzt
Server s = this.client.GetServer(serverId);


Steht s auf null. Obwohl die Id korrekt ist und der client vorhanden ist. Das ist es, was mich so stutzig macht ?(

Blizzer

Frischling

Beiträge: 49

Wohnort: Götzis

Beruf: C# Software Entwickler

  • Private Nachricht senden

7

11.04.2017, 08:33

Ich hatte bei mir auch ein ähnliches Problem. Der Bot hat schon die Rechte auf den Discord joinen zu dürfen? Bei mir war es so das ich mich einmal ganz normal mit den Bot Account eingeloggt habe und er so den Server kannte und dann konnte ich mit ihn joinen.

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

8

11.04.2017, 08:52

Der Bot war schon mehrmals auf dem Server online, er besaß nur noch keine Funktionalität.

Wenns jetzt gar nicht geht, muss ich wohl alle Commands und Events in eine große Klasse hauen :S Alle wichtigen Events und Commands sind drin, aber wenn man ihn mal erweitern möchte, wäre es ja gut, wenns ordentlich aufgebaut ist...

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

9

11.04.2017, 16:49

So nachdem ich mit nem Kollegen ne Stunde nach nem Fehler gesucht habe, man kann sich wohl über

C#-Quelltext

1
client.GetServer(serverId);
nicht den Server holen, zumindest bei mir bleibt's immer null.

Jetzt haben wir es anders gelöst, der Bot ist online :)

Werbeanzeige