New restrictions logic for all chats. Fixed filter for /send_league
This commit is contained in:
@@ -12,6 +12,9 @@ import (
|
||||
type ChatterInterface interface {
|
||||
Init()
|
||||
|
||||
BanUserFromChat(user *tgbotapi.User, chatRaw *dbmapping.Chat)
|
||||
ProtectChat(update *tgbotapi.Update, playerRaw *dbmapping.Player, chatRaw *dbmapping.Chat) string
|
||||
|
||||
GetOrCreateChat(update *tgbotapi.Update) (dbmapping.Chat, bool)
|
||||
GetChatByID(chatID int64) (dbmapping.Chat, bool)
|
||||
GetAllPrivateChats() ([]dbmapping.Chat, bool)
|
||||
|
||||
@@ -121,7 +121,7 @@ func (ct *Chatter) GetAllPrivateChats() ([]dbmapping.Chat, bool) {
|
||||
func (ct *Chatter) GetLeaguePrivateChats() ([]dbmapping.Chat, bool) {
|
||||
privateChats := []dbmapping.Chat{}
|
||||
|
||||
err := c.Db.Select(&privateChats, "SELECT c.* FROM chats c, players p WHERE c.chat_type='private' AND p.telegram_id = c.telegram_id AND p.league_id = 1")
|
||||
err := c.Db.Select(&privateChats, "SELECT c.* FROM chats c, players p WHERE c.chat_type='private' AND p.telegram_id = c.telegram_id AND p.league_id = 1 AND p.status != 'spy' AND p.status != 'league_changed'")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return privateChats, false
|
||||
|
||||
@@ -15,6 +15,7 @@ func (ct *Chatter) GroupsList(update *tgbotapi.Update) string {
|
||||
return "fail"
|
||||
}
|
||||
|
||||
academyChatID, _ := strconv.ParseInt(c.Cfg.SpecialChats.AcademyID, 10, 64)
|
||||
bastionChatID, _ := strconv.ParseInt(c.Cfg.SpecialChats.BastionID, 10, 64)
|
||||
defaultChatID, _ := strconv.ParseInt(c.Cfg.SpecialChats.DefaultID, 10, 64)
|
||||
hqChatID, _ := strconv.ParseInt(c.Cfg.SpecialChats.HeadquartersID, 10, 64)
|
||||
@@ -31,6 +32,9 @@ func (ct *Chatter) GroupsList(update *tgbotapi.Update) string {
|
||||
} else if groupChats[i].ChatRole == "flood" {
|
||||
message += "Является флудочатом отряда №" + strconv.Itoa(groupChats[i].Squad.ID) + "\n"
|
||||
} else {
|
||||
if groupChats[i].Chat.TelegramID == academyChatID {
|
||||
message += "Является академией лиги\n"
|
||||
}
|
||||
if groupChats[i].Chat.TelegramID == bastionChatID {
|
||||
message += "Является бастионом лиги\n"
|
||||
}
|
||||
|
||||
120
lib/chatter/restricters.go
Normal file
120
lib/chatter/restricters.go
Normal file
@@ -0,0 +1,120 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package chatter
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func (ct *Chatter) userPrivilegesCheck(update *tgbotapi.Update, user *tgbotapi.User) bool {
|
||||
// There are two special chats, pointed by config, where any member of league may be
|
||||
bastionChatID, _ := strconv.ParseInt(c.Cfg.SpecialChats.BastionID, 10, 64)
|
||||
academyChatID, _ := strconv.ParseInt(c.Cfg.SpecialChats.AcademyID, 10, 64)
|
||||
// There are special users, which will bypass these checks
|
||||
specialUsers := []string{"gantz_yaka", "agentpb", "pbhelp"}
|
||||
|
||||
for j := range specialUsers {
|
||||
if strings.ToLower(user.UserName) == specialUsers[j] {
|
||||
// This is for PokememBro admins, they can join any chat at any time
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
playerRaw, ok := c.Users.GetOrCreatePlayer(user.ID)
|
||||
if !ok {
|
||||
return false
|
||||
}
|
||||
|
||||
// So, user is not a PokememBro admin. For Bastion and Academy she needs to be league player
|
||||
switch update.Message.Chat.ID {
|
||||
case academyChatID:
|
||||
if playerRaw.LeagueID == 1 && playerRaw.Status != "spy" && playerRaw.Status != "league_changed" {
|
||||
return true
|
||||
}
|
||||
case bastionChatID:
|
||||
if playerRaw.LeagueID == 1 && playerRaw.Status != "spy" && playerRaw.Status != "league_changed" {
|
||||
return true
|
||||
}
|
||||
default:
|
||||
availableChatsForUser, _ := c.Squader.GetAvailableSquadChatsForUser(&playerRaw)
|
||||
for i := range availableChatsForUser {
|
||||
if update.Message.Chat.ID == availableChatsForUser[i].TelegramID {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// BanUserFromChat removes user from chat
|
||||
func (ct *Chatter) BanUserFromChat(user *tgbotapi.User, chatRaw *dbmapping.Chat) {
|
||||
chatUserConfig := tgbotapi.ChatMemberConfig{
|
||||
ChatID: chatRaw.TelegramID,
|
||||
UserID: user.ID,
|
||||
}
|
||||
|
||||
kickConfig := tgbotapi.KickChatMemberConfig{
|
||||
ChatMemberConfig: chatUserConfig,
|
||||
UntilDate: 1893456000,
|
||||
}
|
||||
|
||||
c.Log.Info("Trying to ban user...")
|
||||
|
||||
_, err := c.Bot.KickChatMember(kickConfig)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
}
|
||||
|
||||
bastionChatID, _ := strconv.ParseInt(c.Cfg.SpecialChats.BastionID, 10, 64)
|
||||
academyChatID, _ := strconv.ParseInt(c.Cfg.SpecialChats.AcademyID, 10, 64)
|
||||
hqChatID, _ := strconv.ParseInt(c.Cfg.SpecialChats.HeadquartersID, 10, 64)
|
||||
if (chatRaw.TelegramID != bastionChatID) || (chatRaw.TelegramID != academyChatID) {
|
||||
// In Bastion notifications are public in default chat
|
||||
commanders, ok := c.Squader.GetCommandersForSquadViaChat(chatRaw)
|
||||
if ok {
|
||||
for i := range commanders {
|
||||
message := "Некто " + c.Users.GetPrettyName(user) + " попытался зайти в чат _" + chatRaw.Name + "_ и был изгнан ботом, так как не имеет права посещать этот чат."
|
||||
|
||||
msg := tgbotapi.NewMessage(int64(commanders[i].TelegramID), message)
|
||||
msg.ParseMode = "Markdown"
|
||||
c.Bot.Send(msg)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
message := "Некто " + c.Users.GetPrettyName(user) + " попытался зайти в один из общих чатов лиги и был изгнан ботом, так как не имеет права посещать этот чат."
|
||||
|
||||
msg := tgbotapi.NewMessage(hqChatID, message)
|
||||
msg.ParseMode = "Markdown"
|
||||
c.Bot.Send(msg)
|
||||
}
|
||||
}
|
||||
|
||||
// ProtectChat protects chats from unauthorized access
|
||||
// Returns "protection_passed" if all protection checks passed
|
||||
func (ct *Chatter) ProtectChat(update *tgbotapi.Update, playerRaw *dbmapping.Player, chatRaw *dbmapping.Chat) string {
|
||||
// Check on new user addition
|
||||
if update.Message.NewChatMembers != nil {
|
||||
newUsers := *update.Message.NewChatMembers
|
||||
if len(newUsers) > 0 {
|
||||
for i := range newUsers {
|
||||
newUserPassed := ct.userPrivilegesCheck(update, &newUsers[i])
|
||||
if !newUserPassed {
|
||||
ct.BanUserFromChat(&newUsers[i], chatRaw)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
existingUserPassed := ct.userPrivilegesCheck(update, update.Message.From)
|
||||
if !existingUserPassed {
|
||||
ct.BanUserFromChat(update.Message.From, chatRaw)
|
||||
return "fail"
|
||||
}
|
||||
|
||||
return c.Squader.CleanFlood(update, chatRaw)
|
||||
}
|
||||
Reference in New Issue
Block a user