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: */