Initial commit
This commit is contained in:
102
internal/moon/chatMemberUpdated.go
Normal file
102
internal/moon/chatMemberUpdated.go
Normal file
@@ -0,0 +1,102 @@
|
||||
package moon
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/NicoNex/echotron/v3"
|
||||
)
|
||||
|
||||
// newChatMember parses one of types ChatMemberUpdated event.
|
||||
// https://core.telegram.org/bots/api#chatmemberupdated
|
||||
func newChatMember(msg *echotron.Update) {
|
||||
var (
|
||||
joinTimestampString string
|
||||
)
|
||||
|
||||
// Spam bots come with these attributes.
|
||||
// msg.ChatMember.NewChatMember.Status = "member"
|
||||
// msg.ChatMember.OldChatMember.User != nil
|
||||
// msg.ChatMember.OldChatMember.Status = "left"
|
||||
|
||||
Log.Infof(
|
||||
"User %s %s (username = %s, id = %d) in chat %s %s (%d) now %s was %s",
|
||||
msg.ChatMember.NewChatMember.User.FirstName,
|
||||
msg.ChatMember.NewChatMember.User.LastName,
|
||||
msg.ChatMember.NewChatMember.User.Username,
|
||||
msg.ChatMember.NewChatMember.User.ID,
|
||||
msg.ChatMember.Chat.Type,
|
||||
msg.ChatMember.Chat.Title,
|
||||
msg.ChatMember.Chat.ID,
|
||||
msg.ChatMember.NewChatMember.Status,
|
||||
msg.ChatMember.OldChatMember.Status,
|
||||
)
|
||||
|
||||
// To avoid race conditions.
|
||||
// To really avoid them, this particular event and newChatMember handler must be serialized via channel.
|
||||
time.Sleep(10 * time.Second)
|
||||
|
||||
Log.Info("Processing UpdateUser event")
|
||||
|
||||
// Try to get timestamp when this member joined to chat
|
||||
joinTimestampString = Cfg.GetValue(
|
||||
"NewMembers",
|
||||
fmt.Sprintf("%d", msg.ChatMember.Chat.ID),
|
||||
fmt.Sprintf("%d", msg.ChatMember.NewChatMember.User.ID),
|
||||
)
|
||||
|
||||
// Нормальный человек, который зашёл с правильным ивентом, через message с атрибутом new_chat_members
|
||||
// https://core.telegram.org/bots/api#message
|
||||
if joinTimestampString != "" {
|
||||
return
|
||||
}
|
||||
|
||||
// Check some other attributes.
|
||||
if msg.ChatMember.OldChatMember.Status == "left" && msg.ChatMember.NewChatMember.Status == "member" {
|
||||
leftTimestampString := Cfg.GetValue(
|
||||
"LeftMembers",
|
||||
fmt.Sprintf("%d", msg.ChatMember.Chat.ID),
|
||||
fmt.Sprintf("%d", msg.ChatMember.NewChatMember.User.ID),
|
||||
)
|
||||
|
||||
// Yes, this member definitely left chat at some point, we have no question to him/her.
|
||||
if leftTimestampString != "" {
|
||||
return
|
||||
}
|
||||
|
||||
// Very suspicious coincedence, looks like we've got bot here.
|
||||
banDate := time.Now().Unix() + 45
|
||||
|
||||
if res, err := Tg.BanChatMember(
|
||||
msg.ChatID(),
|
||||
msg.ChatMember.NewChatMember.User.ID,
|
||||
&echotron.BanOptions{
|
||||
UntilDate: int(banDate),
|
||||
},
|
||||
); err != nil {
|
||||
Log.Errorf(
|
||||
"Unable to ban user with id %d in chat %s: %s",
|
||||
msg.ChatMember.NewChatMember.User.ID,
|
||||
msg.ChatID(),
|
||||
res.Description,
|
||||
)
|
||||
} else {
|
||||
if !res.Ok {
|
||||
Log.Errorf(
|
||||
"Unable to ban user with id %d in chat %s: %s",
|
||||
msg.ChatMember.NewChatMember.User.ID,
|
||||
msg.ChatID(),
|
||||
res.Description,
|
||||
)
|
||||
} else {
|
||||
Log.Infof(
|
||||
"Banned user with id %d in chat %d.",
|
||||
msg.ChatMember.NewChatMember.User.ID,
|
||||
msg.ChatID(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* vim: set ft=go noet ai ts=4 sw=4 sts=4: */
|
||||
Reference in New Issue
Block a user