little refactoring
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Pavel 2024-05-13 19:46:55 +03:00
parent 3b6c3e28f3
commit b4ee5f77b8
4 changed files with 94 additions and 73 deletions

View File

@ -34,22 +34,88 @@ func (s *AddChatMemberState) Handle(pl *Wizard, mc fsm.MachineControls[*Wizard])
defer func() { defer func() {
s.Move(mc, next, pl) s.Move(mc, next, pl)
}() }()
cr := s.App.DB().ForChat() cr := s.App.DB().ForChat()
tgChat := pl.Data.MyChatMember.Chat tgChat := pl.Data.MyChatMember.Chat
user, chat := s.getUserAndChat(tgChat)
if user == nil || chat == nil {
return
}
s.Payload.Loc = s.Localizer(user.Language)
if s.handleTooManyMembers(tgChat.ID) {
return
}
if chat.ID == 0 {
chat = &model.Chat{
TelegramID: tgChat.ID,
UserID: user.ID,
}
err := cr.Save(chat)
if err != nil {
s.curseAndLeave(tgChat.ID, err)
return
}
} else {
chat.UserID = user.ID
err := s.App.DB().ForIntegration().DeleteForChat(chat.ID)
if err != nil {
s.curseAndLeave(tgChat.ID, err)
return
}
err = cr.Save(chat)
if err != nil {
s.curseAndLeave(tgChat.ID, err)
return
}
}
_, err := s.App.TG().SendMessage(&telego.SendMessageParams{
ChatID: tu.ID(user.ChatID),
Text: s.Payload.Loc.Template("bot_was_added", map[string]interface{}{"Name": tgChat.Title}),
ParseMode: telego.ModeMarkdown,
})
s.LogError(err)
pl.User = user
pl.TGChat = tgChat
next = KeyboardChooserStateID
}
func (s *AddChatMemberState) handleTooManyMembers(chatID int64) bool {
totalMembers, err := s.App.TG().GetChatMemberCount(&telego.GetChatMemberCountParams{
ChatID: tu.ID(chatID),
})
if err != nil {
s.curseAndLeave(chatID, err)
return true
}
if *totalMembers > MaxChatMembers {
_, err = s.App.TG().SendMessage(&telego.SendMessageParams{
ChatID: tu.ID(chatID),
Text: s.Payload.Loc.Template(
"too_many_members_in_the_group", map[string]interface{}{"Limit": MaxChatMembers}),
ParseMode: telego.ModeMarkdown,
})
s.leaveChat(chatID)
s.LogError(err)
return true
}
return false
}
func (s *AddChatMemberState) getUserAndChat(tgChat telego.Chat) (*model.User, *model.Chat) {
cr := s.App.DB().ForChat()
chat, err := cr.ByTelegramID(tgChat.ID) chat, err := cr.ByTelegramID(tgChat.ID)
if err != nil { if err != nil {
s.LogError(util.SendInternalError(s.App.TG(), tgChat.ID, nil)) s.curseAndLeave(tgChat.ID, err)
s.leaveChat(tgChat.ID) return nil, nil
s.LogError(err)
return
} }
user, err := s.getRegisteredAdmin(tgChat.ID) user, err := s.getRegisteredAdmin(tgChat.ID)
if err != nil { if err != nil {
s.LogError(util.SendInternalError(s.App.TG(), tgChat.ID, nil)) s.curseAndLeave(tgChat.ID, err)
s.leaveChat(tgChat.ID) return nil, nil
s.LogError(err)
return
} }
if user == nil || user.ID == 0 { if user == nil || user.ID == 0 {
_, err = s.App.TG().SendMessage(&telego.SendMessageParams{ _, err = s.App.TG().SendMessage(&telego.SendMessageParams{
@ -60,70 +126,15 @@ func (s *AddChatMemberState) Handle(pl *Wizard, mc fsm.MachineControls[*Wizard])
}) })
s.leaveChat(tgChat.ID) s.leaveChat(tgChat.ID)
s.LogError(err) s.LogError(err)
return return nil, nil
} }
return user, chat
}
loc := s.Localizer(user.Language) func (s *AddChatMemberState) curseAndLeave(chatID int64, err error) {
totalMembers, err := s.App.TG().GetChatMemberCount(&telego.GetChatMemberCountParams{ s.LogError(util.SendInternalError(s.App.TG(), chatID, s.Localizer()))
ChatID: tu.ID(tgChat.ID), s.leaveChat(chatID)
})
if err != nil {
s.LogError(util.SendInternalError(s.App.TG(), tgChat.ID, nil))
s.leaveChat(tgChat.ID)
s.LogError(err) s.LogError(err)
return
}
if *totalMembers > MaxChatMembers {
_, err = s.App.TG().SendMessage(&telego.SendMessageParams{
ChatID: tu.ID(tgChat.ID),
Text: loc.Template("too_many_members_in_the_group", map[string]interface{}{"Limit": MaxChatMembers}),
ParseMode: telego.ModeMarkdown,
})
s.leaveChat(tgChat.ID)
s.LogError(err)
return
}
if chat == nil || chat.ID == 0 {
chat = &model.Chat{
TelegramID: tgChat.ID,
UserID: user.ID,
}
err := cr.Save(chat)
if err != nil {
s.LogError(util.SendInternalError(s.App.TG(), tgChat.ID, loc))
s.leaveChat(tgChat.ID)
s.LogError(err)
return
}
} else {
chat.UserID = user.ID
err := s.App.DB().ForIntegration().DeleteForChat(chat.ID)
if err != nil {
s.LogError(util.SendInternalError(s.App.TG(), tgChat.ID, loc))
s.leaveChat(tgChat.ID)
s.LogError(err)
return
}
err = cr.Save(chat)
if err != nil {
s.LogError(util.SendInternalError(s.App.TG(), tgChat.ID, loc))
s.leaveChat(tgChat.ID)
s.LogError(err)
return
}
}
_, err = s.App.TG().SendMessage(&telego.SendMessageParams{
ChatID: tu.ID(user.ChatID),
Text: loc.Template("bot_was_added", map[string]interface{}{"Name": tgChat.Title}),
ParseMode: telego.ModeMarkdown,
})
s.LogError(err)
pl.User = user
pl.TGChat = tgChat
pl.Loc = loc
next = KeyboardChooserStateID
} }
func (s *AddChatMemberState) getRegisteredAdmin(chatID int64) (*model.User, error) { func (s *AddChatMemberState) getRegisteredAdmin(chatID int64) (*model.User, error) {

View File

@ -32,6 +32,15 @@ func (s State) Localizer(langCode ...string) locale.Localizer {
lang := language.English.String() lang := language.English.String()
if len(langCode) > 0 { if len(langCode) > 0 {
lang = langCode[0] lang = langCode[0]
} else {
if s.Payload.User != nil {
lang = s.Payload.User.Language
} else if s.Payload.UserID > 0 {
user, _ := s.App.DB().ForUser().ByTelegramID(s.Payload.UserID)
if user != nil && user.Language != "" {
lang = user.Language
}
}
} }
if s.Payload.Loc != nil && (len(langCode) == 0 || s.Payload.Loc.Tag().String() == lang) { if s.Payload.Loc != nil && (len(langCode) == 0 || s.Payload.Loc.Tag().String() == lang) {
return s.Payload.Loc return s.Payload.Loc

View File

@ -26,12 +26,12 @@ func init() {
wizards = storage wizards = storage
} }
func Get(chatID int64) fsm.IMachine[Wizard] { func Get(userID int64) fsm.IMachine[Wizard] {
if machine, ok := wizards.Get(chatID); ok { if machine, ok := wizards.Get(userID); ok {
return machine return machine
} }
machine := newWizard() machine := newWizard()
wizards.Set(chatID, machine) wizards.Set(userID, machine)
return machine return machine
} }

View File

@ -19,7 +19,7 @@ func NewRemoveChatMemberState(app iface.App) fsm.IState[Wizard] {
func (s *RemoveChatMemberState) Enter(pl *Wizard, mc fsm.MachineControls[*Wizard]) error { func (s *RemoveChatMemberState) Enter(pl *Wizard, mc fsm.MachineControls[*Wizard]) error {
if pl.Data.MyChatMember == nil { if pl.Data.MyChatMember == nil {
s.LogError(mc.Move(WaitingForMemberWebhookStateID, pl)) s.Move(mc, WaitingForMemberWebhookStateID, pl)
} }
return nil return nil
} }
@ -44,6 +44,7 @@ func (s *RemoveChatMemberState) Handle(pl *Wizard, mc fsm.MachineControls[*Wizar
} }
s.LogError(cr.Delete(chat)) s.LogError(cr.Delete(chat))
} }
s.Move(mc, WaitingForMemberWebhookStateID, pl)
} }
func (s *RemoveChatMemberState) ID() fsm.StateID { func (s *RemoveChatMemberState) ID() fsm.StateID {