diff --git a/connect.go b/connect.go index 058e967..5a6763c 100644 --- a/connect.go +++ b/connect.go @@ -1,6 +1,8 @@ package main import ( + "time" + nex "github.com/PretendoNetwork/nex-go" ) @@ -47,4 +49,8 @@ func connect(packet *nex.PacketV0) { connectedUser.PID = packet.Sender().PID() connectedUser.Client = packet.Sender() connectedUsers[userPID] = connectedUser + + lastOnline := nex.NewDateTime(0) + lastOnline.FromTimestamp(time.Now()) + updateUserLastOnlineTime(packet.Sender().PID(), lastOnline) } diff --git a/database.go b/database.go index 009b5ea..60eac2c 100644 --- a/database.go +++ b/database.go @@ -200,6 +200,12 @@ func updateNintendoPresenceV2(presence *nexproto.NintendoPresenceV2) { } +func updateUserLastOnlineTime(pid uint32, lastOnline *nex.DateTime) { + if err := cassandraClusterSession.Query(`UPDATE pretendo_friends.users SET last_online=? WHERE pid=?`, lastOnline.Value(), pid).Exec(); err != nil { + log.Fatal(err) + } +} + // Get a users comment func getUserComment(pid uint32) *nexproto.Comment { var content string @@ -241,11 +247,15 @@ func getUserFriendList(pid uint32) []*nexproto.FriendInfo { friendInfo := nexproto.NewFriendInfo() connectedUser := connectedUsers[friendPID] + var lastOnline *nex.DateTime if connectedUser != nil { // Online friendInfo.NNAInfo = connectedUser.NNAInfo friendInfo.Presence = connectedUser.Presence + + lastOnline = nex.NewDateTime(0) + lastOnline.FromTimestamp(time.Now()) } else { // Offline friendUserInforation := getUserInfoByPID(friendPID) @@ -284,11 +294,20 @@ func getUserFriendList(pid uint32) []*nexproto.FriendInfo { friendInfo.Presence.Unknown5 = 0 friendInfo.Presence.Unknown6 = 0 friendInfo.Presence.Unknown7 = 0 + + var lastOnlineTime uint64 + if err := cassandraClusterSession.Query(`SELECT last_online FROM pretendo_friends.users WHERE pid=?`, friendPID).Scan(&lastOnlineTime); err != nil { + log.Fatal(err) + } + + fmt.Println(lastOnlineTime) + + lastOnline = nex.NewDateTime(lastOnlineTime) // TODO: Change this } friendInfo.Status = getUserComment(friendPID) friendInfo.BecameFriend = nex.NewDateTime(uint64(sliceMap[i]["date"].(int64))) - friendInfo.LastOnline = nex.NewDateTime(uint64(sliceMap[i]["date"].(int64))) // TODO: Change this + friendInfo.LastOnline = lastOnline friendInfo.Unknown = 0 friendList = append(friendList, friendInfo) @@ -489,11 +508,15 @@ func acceptFriendshipAndReturnFriendInfo(friendRequestID uint64) *nexproto.Frien friendInfo := nexproto.NewFriendInfo() connectedUser := connectedUsers[senderPID] + var lastOnline *nex.DateTime if connectedUser != nil { // Online friendInfo.NNAInfo = connectedUser.NNAInfo friendInfo.Presence = connectedUser.Presence + + lastOnline = nex.NewDateTime(0) + lastOnline.FromTimestamp(time.Now()) } else { // Offline senderUserInforation := getUserInfoByPID(senderPID) @@ -526,17 +549,24 @@ func acceptFriendshipAndReturnFriendInfo(friendRequestID uint64) *nexproto.Frien friendInfo.Presence.Unknown3 = 0 friendInfo.Presence.GameServerID = 0 friendInfo.Presence.Unknown4 = 0 - friendInfo.Presence.PID = 0 + friendInfo.Presence.PID = senderPID friendInfo.Presence.GatheringID = 0 friendInfo.Presence.ApplicationData = []byte{0x00} friendInfo.Presence.Unknown5 = 0 friendInfo.Presence.Unknown6 = 0 friendInfo.Presence.Unknown7 = 0 + + var lastOnlineTime uint64 + if err := cassandraClusterSession.Query(`SELECT last_online FROM pretendo_friends.users WHERE pid=?`, senderPID).Scan(&lastOnlineTime); err != nil { + log.Fatal(err) + } + + lastOnline = nex.NewDateTime(lastOnlineTime) // TODO: Change this } friendInfo.Status = getUserComment(senderPID) friendInfo.BecameFriend = acceptedTime - friendInfo.LastOnline = acceptedTime // TODO: Change this + friendInfo.LastOnline = lastOnline // TODO: Change this friendInfo.Unknown = 0 return friendInfo diff --git a/main.go b/main.go index a5ef14b..9574591 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "time" nex "github.com/PretendoNetwork/nex-go" nexproto "github.com/PretendoNetwork/nex-protocols-go" @@ -29,6 +30,10 @@ func main() { nexServer.On("Disconnect", func(packet *nex.PacketV0) { pid := packet.Sender().PID() delete(connectedUsers, pid) + + lastOnline := nex.NewDateTime(0) + lastOnline.FromTimestamp(time.Now()) + updateUserLastOnlineTime(pid, lastOnline) }) secureServer = nexproto.NewSecureProtocol(nexServer)