162 lines
3.1 KiB
Go
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: */
|