Files
bunny-bot/internal/moon/runAndBan.go
2025-06-09 10:23:15 +03:00

162 lines
3.1 KiB
Go

package moon
import (
"slices"
"strconv"
"strings"
"time"
)
func RunAndBan() {
for {
var ListAppearedMembers, ListNewMembers []string
AppearedMembers.Range(
func(k, _ any) bool {
ListAppearedMembers = append(ListAppearedMembers, k.(string))
return true
},
)
NewMembers.Range(
func(k, _ any) bool {
ListNewMembers = append(ListNewMembers, k.(string))
return true
},
)
for _, AppearedMember := range ListAppearedMembers {
for _, NewMember := range ListNewMembers {
if AppearedMember == NewMember {
AppearedMembers.Delete(AppearedMember)
NewMembers.Delete(NewMember)
}
}
}
currentTime := time.Now().Unix()
ListAppearedMembers = ListAppearedMembers[:0]
ListNewMembers = ListNewMembers[:0]
ListAppearedMembers = slices.Clip(ListAppearedMembers)
ListNewMembers = slices.Clip(ListNewMembers)
AppearedMembers.Range(
func(k, _ any) bool {
ListAppearedMembers = append(ListAppearedMembers, k.(string))
return true
},
)
NewMembers.Range(
func(k, _ any) bool {
ListNewMembers = append(ListNewMembers, k.(string))
return true
},
)
for _, AppearedMember := range ListAppearedMembers {
eventTimestamp, found := AppearedMembers.Get(AppearedMember)
if !found {
continue
}
eventTimeDelta := currentTime - eventTimestamp.(int64)
// Spammer?
if eventTimeDelta > 10 {
item := strings.Split(AppearedMember, "+")
chatid, err := strconv.ParseInt(item[0], 10, 64)
if err != nil {
Log.Errorf("Got broken key in AppearedMembers cache: %s", AppearedMember)
continue
}
userid, err := strconv.ParseInt(item[1], 10, 64)
if err != nil {
Log.Errorf("Got broken key in AppearedMembers cache: %s", AppearedMember)
continue
}
Log.Infof(
"Ban user %s %s (username = %s, id = %d) in chat %s %s (%d) that have no newChatMember message since chatMemberUpdated for more than 10 seconds",
"",
"",
"",
userid,
"",
"",
chatid,
)
squash(
chatid,
"",
"",
userid,
"",
"",
"",
)
AppearedMembers.Delete(AppearedMember)
}
}
for _, NewMember := range ListNewMembers {
eventTimestamp, found := NewMembers.Get(NewMember)
if !found {
continue
}
eventTimeDelta := currentTime - eventTimestamp.(int64)
// Spammer?
if eventTimeDelta > 10 {
item := strings.Split(NewMember, "+")
chatid, err := strconv.ParseInt(item[0], 10, 64)
if err != nil {
Log.Errorf("Got broken key in AppearedMembers cache: %s", NewMember)
continue
}
userid, err := strconv.ParseInt(item[1], 10, 64)
if err != nil {
Log.Errorf("Got broken key in AppearedMembers cache: %s", NewMember)
continue
}
Log.Debugf("Clean newChatMember event record older than 10 seconds for user user %s %s (username = %s, id = %d) in chat %s %s (%d)",
"",
"",
"",
userid,
"",
"",
chatid,
)
NewMembers.Delete(NewMember)
}
}
time.Sleep(10 * time.Second)
}
}
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */