Skip to content

Commit 9dbfa83

Browse files
committed
Add muting users for spamming + refactor import cycle
1 parent 4516972 commit 9dbfa83

File tree

10 files changed

+123
-43
lines changed

10 files changed

+123
-43
lines changed

chat/chat.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/disgoorg/disgo/webhook"
1111
"log"
1212
"sync"
13+
"time"
1314
)
1415

1516
var (
@@ -32,17 +33,10 @@ func GetAvailableChannels(userGroups common.UserGroups) []*Channel {
3233
chatMutex.Lock()
3334
defer chatMutex.Unlock()
3435

35-
hasAdminChannelAccess := common.HasAnyUserGroup(userGroups, []common.UserGroups{
36-
common.UserGroupSwan,
37-
common.UserGroupDeveloper,
38-
common.UserGroupAdmin,
39-
common.UserGroupModerator,
40-
})
41-
4236
var availableChannels []*Channel
4337

4438
for _, channel := range channels {
45-
if !channel.AdminOnly || (channel.AdminOnly && hasAdminChannelAccess) {
39+
if !channel.AdminOnly || (channel.AdminOnly && isChatModerator(userGroups)) {
4640
availableChannels = append(availableChannels, channel)
4741
}
4842
}
@@ -63,8 +57,12 @@ func SendMessage(sender *sessions.User, receiver string, message string) {
6357
return
6458
}
6559

66-
// TODO: Track spam messages and mute user for spamming
67-
// TODO: Censor message
60+
sender.IncrementSpammedMessagesCount()
61+
62+
if sender.GetSpammedMessagesCount() >= 10 && !isChatModerator(sender.Info.UserGroups) {
63+
_ = sender.MuteUser(time.Minute * 30)
64+
return
65+
}
6866

6967
var discordWebhook webhook.Client
7068

@@ -137,3 +135,13 @@ func removeChannel(channel *Channel) {
137135
channel.removeAllUsers()
138136
delete(channels, channel.Name)
139137
}
138+
139+
// Returns if the user is a moderator of the chat
140+
func isChatModerator(userGroups common.UserGroups) bool {
141+
return common.HasAnyUserGroup(userGroups, []common.UserGroups{
142+
common.UserGroupSwan,
143+
common.UserGroupDeveloper,
144+
common.UserGroupAdmin,
145+
common.UserGroupModerator,
146+
})
147+
}

db/users.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,14 @@ func UpdateUserSteamAvatar(steamId string) (string, error) {
8282

8383
return avatar, nil
8484
}
85+
86+
// MuteUser Mutes a user for a given duration
87+
func MuteUser(id int, endTime int64) error {
88+
_, err := SQL.Exec("UPDATE users SET mute_end_time = ? WHERE id = ?", endTime, id)
89+
90+
if err != nil {
91+
return err
92+
}
93+
94+
return nil
95+
}

handlers/ClientRequestUserInfo.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package handlers
22

33
import (
4+
"example.com/Quaver/Z/objects"
45
"example.com/Quaver/Z/packets"
56
"example.com/Quaver/Z/sessions"
67
)
@@ -15,8 +16,8 @@ func handleClientRequestUserInfo(user *sessions.User, packet *packets.ClientRequ
1516
sessions.SendPacketToUser(packets.NewServerUserInfo(userInfo), user)
1617
}
1718

18-
func getSerializedUsersFromUserIds(userIds []int) []*sessions.PacketUser {
19-
var userInfo []*sessions.PacketUser
19+
func getSerializedUsersFromUserIds(userIds []int) []*objects.PacketUser {
20+
var userInfo []*objects.PacketUser
2021

2122
for _, id := range userIds {
2223
user := sessions.GetUserById(id)

handlers/login.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,8 @@ func removePreviousLoginSession(user *db.User) error {
388388

389389
// Sends initial packets to log the user in
390390
func sendLoginPackets(user *sessions.User) error {
391-
sessions.SendPacketToUser(packets.NewServerLoginReply(user), user)
391+
user.GetStats()
392+
sessions.SendPacketToUser(packets.NewServerLoginReply(user.SerializeForPacket(), user.GetStatsSlice(), user.GetToken()), user)
392393
sessions.SendPacketToUser(packets.NewServerUsersOnline(sessions.GetOnlineUserIds()), user)
393394
sessions.SendPacketToUser(packets.NewServerUserInfo(sessions.GetSerializedOnlineUsers()), user)
394395

objects/user.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package objects
2+
3+
import "example.com/Quaver/Z/common"
4+
5+
type PacketUser struct {
6+
Id int `json:"id"`
7+
SteamId string `json:"sid"`
8+
Username string `json:"u"`
9+
UserGroups common.UserGroups `json:"ug"`
10+
MuteEndTime int64 `json:"m"`
11+
Country string `json:"c"`
12+
}

packets/ServerLoginReply.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,21 @@ package packets
22

33
import (
44
"example.com/Quaver/Z/db"
5-
"example.com/Quaver/Z/sessions"
5+
"example.com/Quaver/Z/objects"
66
)
77

88
type ServerLoginReply struct {
99
Packet
10-
User *sessions.PacketUser `json:"u"`
10+
User *objects.PacketUser `json:"u"`
1111
SessionToken string `json:"t"`
1212
Stats []*db.PacketUserStats `json:"s"`
1313
}
1414

15-
func NewServerLoginReply(user *sessions.User) *ServerLoginReply {
16-
statSlice := make([]*db.PacketUserStats, 0)
17-
18-
for _, value := range user.GetStats() {
19-
statSlice = append(statSlice, value.SerializeForPacket())
20-
}
21-
15+
func NewServerLoginReply(user *objects.PacketUser, stats []*db.PacketUserStats, token string) *ServerLoginReply {
2216
return &ServerLoginReply{
2317
Packet: Packet{Id: PacketIdServerLoginReply},
24-
User: user.SerializeForPacket(),
25-
SessionToken: user.GetToken(),
26-
Stats: statSlice,
18+
User: user,
19+
SessionToken: token,
20+
Stats: stats,
2721
}
2822
}

packets/ServerUserConnected.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package packets
22

3-
import "example.com/Quaver/Z/sessions"
3+
import (
4+
"example.com/Quaver/Z/objects"
5+
)
46

57
type ServerUserConnected struct {
68
Packet
7-
User *sessions.PacketUser `json:"u"`
9+
User *objects.PacketUser `json:"u"`
810
}
911

10-
func NewServerUserConnected(user *sessions.PacketUser) *ServerUserConnected {
12+
func NewServerUserConnected(user *objects.PacketUser) *ServerUserConnected {
1113
return &ServerUserConnected{
1214
Packet: Packet{Id: PacketIdServerUserConnected},
1315
User: user,

packets/ServerUserInfo.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package packets
22

3-
import "example.com/Quaver/Z/sessions"
3+
import (
4+
"example.com/Quaver/Z/objects"
5+
)
46

57
type ServerUserInfo struct {
68
Packet
7-
Users []*sessions.PacketUser `json:"u"`
9+
Users []*objects.PacketUser `json:"u"`
810
}
911

10-
func NewServerUserInfo(users []*sessions.PacketUser) *ServerUserInfo {
12+
func NewServerUserInfo(users []*objects.PacketUser) *ServerUserInfo {
1113
return &ServerUserInfo{
1214
Packet: Packet{Id: PacketIdServerUserInfo},
1315
Users: users,

sessions/sessions.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package sessions
22

33
import (
4+
"example.com/Quaver/Z/objects"
45
"net"
56
"sync"
67
)
@@ -125,11 +126,11 @@ func GetOnlineUsers() []*User {
125126
}
126127

127128
// GetSerializedOnlineUsers Returns a list of all online users serialized
128-
func GetSerializedOnlineUsers() []*PacketUser {
129+
func GetSerializedOnlineUsers() []*objects.PacketUser {
129130
userMutex.Lock()
130131
defer userMutex.Unlock()
131132

132-
users := make([]*PacketUser, 0)
133+
users := make([]*objects.PacketUser, 0)
133134

134135
for _, user := range userIdToUser {
135136
users = append(users, user.SerializeForPacket())

sessions/user.go

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"example.com/Quaver/Z/common"
55
"example.com/Quaver/Z/db"
66
"example.com/Quaver/Z/objects"
7+
"example.com/Quaver/Z/packets"
78
"example.com/Quaver/Z/utils"
89
"fmt"
910
"log"
@@ -39,15 +40,9 @@ type User struct {
3940

4041
// The current client status of the user
4142
status *objects.ClientStatus
42-
}
4343

44-
type PacketUser struct {
45-
Id int `json:"id"`
46-
SteamId string `json:"sid"`
47-
Username string `json:"u"`
48-
UserGroups common.UserGroups `json:"ug"`
49-
MuteEndTime int64 `json:"m"`
50-
Country string `json:"c"`
44+
// A count of the amount of messages the user has spammed in the past x amount of time. Used for muting purposes.
45+
spammedChatMessages int
5146
}
5247

5348
// NewUser Creates a new user session struct object
@@ -84,6 +79,16 @@ func (u *User) GetStats() map[common.Mode]*db.UserStats {
8479
return u.stats
8580
}
8681

82+
func (u *User) GetStatsSlice() []*db.PacketUserStats {
83+
statSlice := make([]*db.PacketUserStats, 0)
84+
85+
for _, value := range u.GetStats() {
86+
statSlice = append(statSlice, value.SerializeForPacket())
87+
}
88+
89+
return statSlice
90+
}
91+
8792
// SetStats Updates the statistics for the user
8893
func (u *User) SetStats() error {
8994
u.mutex.Lock()
@@ -172,6 +177,30 @@ func (u *User) SetClientStatus(status *objects.ClientStatus) {
172177
}
173178
}
174179

180+
// GetSpammedMessagesCount Gets the amount of messages the user has spammed
181+
func (u *User) GetSpammedMessagesCount() int {
182+
u.mutex.Lock()
183+
defer u.mutex.Unlock()
184+
185+
return u.spammedChatMessages
186+
}
187+
188+
// IncrementSpammedMessagesCount Increments the amount of spammed messages by 1.
189+
func (u *User) IncrementSpammedMessagesCount() {
190+
u.mutex.Lock()
191+
defer u.mutex.Unlock()
192+
193+
u.spammedChatMessages++
194+
}
195+
196+
// ResetSpammedMessagesCount Resets the amount of spammed messages back to zero
197+
func (u *User) ResetSpammedMessagesCount() {
198+
u.mutex.Lock()
199+
defer u.mutex.Unlock()
200+
201+
u.spammedChatMessages = 0
202+
}
203+
175204
// IsMuted Returns if the user is muted
176205
func (u *User) IsMuted() bool {
177206
u.mutex.Lock()
@@ -180,12 +209,31 @@ func (u *User) IsMuted() bool {
180209
return u.Info.MuteEndTime > time.Now().UnixMilli()
181210
}
182211

212+
// MuteUser Mutes a user for a specified duration
213+
func (u *User) MuteUser(duration time.Duration) error {
214+
u.mutex.Lock()
215+
defer u.mutex.Unlock()
216+
217+
endTime := time.Now().UnixMilli() + duration.Milliseconds()
218+
219+
err := db.MuteUser(u.Info.Id, endTime)
220+
221+
if err != nil {
222+
log.Printf("Failed to update user mute time: %v\n", err)
223+
return err
224+
}
225+
226+
u.Info.MuteEndTime = endTime
227+
SendPacketToUser(packets.NewServerPing(), u)
228+
return nil
229+
}
230+
183231
// SerializeForPacket Serializes the user to be used in a packet
184-
func (u *User) SerializeForPacket() *PacketUser {
232+
func (u *User) SerializeForPacket() *objects.PacketUser {
185233
u.mutex.Lock()
186234
defer u.mutex.Unlock()
187235

188-
return &PacketUser{
236+
return &objects.PacketUser{
189237
Id: u.Info.Id,
190238
SteamId: u.Info.SteamId,
191239
Username: u.Info.Username,

0 commit comments

Comments
 (0)