From f33ae1d660a81627e489f94bcdf1b82fbcf02ab8 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Tue, 2 Nov 2021 18:40:25 -0400 Subject: [PATCH] Added "Player went offline" notifications --- main.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/main.go b/main.go index 38fd85e..f7851c4 100644 --- a/main.go +++ b/main.go @@ -34,7 +34,9 @@ func main() { lastOnline := nex.NewDateTime(0) lastOnline.FromTimestamp(time.Now()) + updateUserLastOnlineTime(pid, lastOnline) + sendUserWentOfflineWiiUNotifications(packet.Sender()) fmt.Println("Leaving") }) @@ -83,3 +85,56 @@ func main() { nexServer.Listen(":60001") } + +// Maybe this function should go in a different file? +func sendUserWentOfflineWiiUNotifications(client *nex.Client) { + lastOnline := nex.NewDateTime(0) + lastOnline.FromTimestamp(time.Now()) + + nintendoNotificationEventGeneral := nexproto.NewNintendoNotificationEventGeneral() + + nintendoNotificationEventGeneral.U32Param = 0 + nintendoNotificationEventGeneral.U64Param1 = 0 + nintendoNotificationEventGeneral.U64Param2 = lastOnline.Value() + nintendoNotificationEventGeneral.StrParam = "" + + eventObject := nexproto.NewNintendoNotificationEvent() + eventObject.Type = 10 + eventObject.SenderPID = client.PID() + eventObject.DataHolder = nex.NewDataHolder() + eventObject.DataHolder.Name = "NintendoNotificationEventGeneral" + eventObject.DataHolder.Object = nintendoNotificationEventGeneral + + stream := nex.NewStreamOut(nexServer) + stream.WriteStructure(eventObject) + + rmcRequest := nex.NewRMCRequest() + rmcRequest.SetProtocolID(nexproto.NintendoNotificationsProtocolID) + rmcRequest.SetCallID(3810693103) + rmcRequest.SetMethodID(nexproto.NintendoNotificationsMethodProcessNintendoNotificationEvent1) + rmcRequest.SetParameters(stream.Bytes()) + + rmcRequestBytes := rmcRequest.Bytes() + + friendList := getUserFriendList(client.PID()) + + for i := 0; i < len(friendList); i++ { + friendPID := friendList[i].NNAInfo.PrincipalBasicInfo.PID + connectedUser := connectedUsers[friendPID] + + if connectedUser != nil { + requestPacket, _ := nex.NewPacketV0(connectedUser.Client, nil) + + requestPacket.SetVersion(0) + requestPacket.SetSource(0xA1) + requestPacket.SetDestination(0xAF) + requestPacket.SetType(nex.DataPacket) + requestPacket.SetPayload(rmcRequestBytes) + + requestPacket.AddFlag(nex.FlagNeedsAck) + requestPacket.AddFlag(nex.FlagReliable) + + nexServer.Send(requestPacket) + } + } +}