Archived
1

Pins to selected chats

Closes #6
This commit is contained in:
Vladimir Hodakov 2017-11-26 08:31:56 +04:00
parent a6811f61fc
commit 8368a3c60b
7 changed files with 120 additions and 4 deletions

View File

@ -17,6 +17,7 @@ type ChatterInterface interface {
GetAllPrivateChats() ([]dbmapping.Chat, bool) GetAllPrivateChats() ([]dbmapping.Chat, bool)
GetLeaguePrivateChats() ([]dbmapping.Chat, bool) GetLeaguePrivateChats() ([]dbmapping.Chat, bool)
GetAllGroupChats() ([]dbmapping.Chat, bool) GetAllGroupChats() ([]dbmapping.Chat, bool)
GetGroupChatsByIDs(chatsIDs string) ([]dbmapping.Chat, bool)
UpdateChatTitle(chatRaw *dbmapping.Chat, newTitle string) (*dbmapping.Chat, bool) UpdateChatTitle(chatRaw *dbmapping.Chat, newTitle string) (*dbmapping.Chat, bool)
UpdateChatTelegramID(update *tgbotapi.Update) (*dbmapping.Chat, bool) UpdateChatTelegramID(update *tgbotapi.Update) (*dbmapping.Chat, bool)

View File

@ -6,6 +6,8 @@ package chatter
import ( import (
"github.com/go-telegram-bot-api/telegram-bot-api" "github.com/go-telegram-bot-api/telegram-bot-api"
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping" "lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
"strconv"
"strings"
"time" "time"
) )
@ -140,3 +142,34 @@ func (ct *Chatter) GetAllGroupChats() ([]dbmapping.Chat, bool) {
return groupChats, true return groupChats, true
} }
// GetGroupChatsByIDs returns group chats with selected IDs
func (ct *Chatter) GetGroupChatsByIDs(chatsIDs string) ([]dbmapping.Chat, bool) {
groupChats := []dbmapping.Chat{}
queryIDs := make([]int, 0)
queryIDsStr := strings.Split(chatsIDs, ",")
for i := range queryIDsStr {
id, _ := strconv.Atoi(queryIDsStr[i])
if id != 0 {
queryIDs = append(queryIDs, id)
}
}
finalQueryIDs := ""
for i := range queryIDs {
finalQueryIDs += strconv.Itoa(queryIDs[i])
if i < len(queryIDs)-1 {
finalQueryIDs += ","
}
}
c.Log.Debug("Chat query IDs: " + finalQueryIDs)
err := c.Db.Select(&groupChats, "SELECT * FROM chats WHERE chat_type IN ('group', 'supergroup') AND id IN ("+finalQueryIDs+")")
if err != nil {
c.Log.Error(err)
return groupChats, false
}
return groupChats, true
}

View File

@ -26,5 +26,5 @@ func New(ac *appcontext.Context) {
func (p *Pinner) Init() { func (p *Pinner) Init() {
c.Log.Info("Initializing Pinner...") c.Log.Info("Initializing Pinner...")
c.Cron.AddFunc("0 55 */2 * * *", p.PinBattleAlert) c.Cron.AddFunc("0 55 4-23/2 * * *", p.PinBattleAlert)
} }

View File

@ -5,6 +5,8 @@ package pinner
import ( import (
"github.com/go-telegram-bot-api/telegram-bot-api" "github.com/go-telegram-bot-api/telegram-bot-api"
"strconv"
"strings"
) )
// PinMessageToAllChats pins message to all groups where bot exist // PinMessageToAllChats pins message to all groups where bot exist
@ -70,6 +72,77 @@ func (p *Pinner) PinMessageToAllChats(update *tgbotapi.Update) string {
return "ok" return "ok"
} }
// PinMessageToSomeChats pins message to selected groups where bot exist
func (p *Pinner) PinMessageToSomeChats(update *tgbotapi.Update) string {
commandArgs := update.Message.CommandArguments()
commandArgsList := strings.Split(commandArgs, " ")
if len(commandArgsList) < 2 {
return "fail"
}
chatsToPin := commandArgsList[0]
messageToPin := commandArgsList[1]
if messageToPin == "" {
return "fail"
}
groupChats, ok := c.Chatter.GetGroupChatsByIDs(chatsToPin)
if !ok {
return "fail"
}
c.Log.Debug("Got " + strconv.Itoa(len(groupChats)) + " group chats...")
for i := range groupChats {
if groupChats[i].ChatType == "supergroup" {
message := messageToPin + "\n\n"
message += "© " + update.Message.From.FirstName + " " + update.Message.From.LastName
message += " (@" + update.Message.From.UserName + ")"
msg := tgbotapi.NewMessage(groupChats[i].TelegramID, message)
msg.ParseMode = "Markdown"
pinnableMessage, err := c.Bot.Send(msg)
if err != nil {
c.Log.Error(err.Error())
message := "*Ваше сообщение не отправлено.*\n\n"
message += "Обычно это связано с тем, что нарушена разметка Markdown. "
message += "К примеру, если вы хотели использовать нижнее\\_подчёркивание, то печатать его надо так — \\\\_. То же самое касается всех управляющих разметкой символов в Markdown в случае, если вы их хотите использовать как текст, а не как управляющий символ Markdown."
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
msg.ParseMode = "Markdown"
c.Bot.Send(msg)
return "fail"
}
pinChatMessageConfig := tgbotapi.PinChatMessageConfig{
ChatID: pinnableMessage.Chat.ID,
MessageID: pinnableMessage.MessageID,
DisableNotification: true,
}
_, err = c.Bot.PinChatMessage(pinChatMessageConfig)
if err != nil {
c.Log.Error(err.Error())
}
}
}
message := "*Ваше сообщение отправлено и запинено во все чаты, где сидит бот.*\n\n"
message += "Текст отправленного сообщения:\n\n"
message += messageToPin
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
msg.ParseMode = "Markdown"
c.Bot.Send(msg)
return "ok"
}
// PinBattleAlert pins to all squads 'battle alert' at :55 of every even hour // PinBattleAlert pins to all squads 'battle alert' at :55 of every even hour
// Even hours are in Moscow timezone // Even hours are in Moscow timezone
func (p *Pinner) PinBattleAlert() { func (p *Pinner) PinBattleAlert() {

View File

@ -12,5 +12,7 @@ type PinnerInterface interface {
Init() Init()
PinBattleAlert() PinBattleAlert()
PinMessageToSomeChats(update *tgbotapi.Update) string
PinMessageToAllChats(update *tgbotapi.Update) string PinMessageToAllChats(update *tgbotapi.Update) string
} }

View File

@ -80,7 +80,7 @@ func (r *Router) routePrivateRequest(update *tgbotapi.Update, playerRaw *dbmappi
} }
return c.Talkers.AnyMessageUnauthorized(update) return c.Talkers.AnyMessageUnauthorized(update)
case update.Message.Command() == "group_chats": case update.Message.Command() == "chats":
if c.Users.PlayerBetterThan(playerRaw, "admin") { if c.Users.PlayerBetterThan(playerRaw, "admin") {
c.Chatter.GroupsList(update) c.Chatter.GroupsList(update)
return "ok" return "ok"
@ -96,6 +96,12 @@ func (r *Router) routePrivateRequest(update *tgbotapi.Update, playerRaw *dbmappi
return c.Talkers.AnyMessageUnauthorized(update) return c.Talkers.AnyMessageUnauthorized(update)
case update.Message.Command() == "pin": case update.Message.Command() == "pin":
if c.Users.PlayerBetterThan(playerRaw, "admin") {
return c.Pinner.PinMessageToSomeChats(update)
}
return c.Talkers.AnyMessageUnauthorized(update)
case update.Message.Command() == "pin_all":
if c.Users.PlayerBetterThan(playerRaw, "admin") { if c.Users.PlayerBetterThan(playerRaw, "admin") {
return c.Pinner.PinMessageToAllChats(update) return c.Pinner.PinMessageToAllChats(update)
} }

View File

@ -20,9 +20,10 @@ func (t *Talkers) HelpMessage(update *tgbotapi.Update, playerRaw *dbmapping.Play
if c.Users.PlayerBetterThan(playerRaw, "admin") { if c.Users.PlayerBetterThan(playerRaw, "admin") {
message += "+ /send\\_all _текст_ — отправить сообщение всем пользователям бота\n" message += "+ /send\\_all _текст_ — отправить сообщение всем пользователям бота\n"
message += "+ /send\\_league _текст_ — отправить сообщение всем пользователям бота, у которых профиль лиги Инстинкт\n" message += "+ /send\\_league _текст_ — отправить сообщение всем пользователям бота, у которых профиль лиги Инстинкт\n"
message += "+ /group\\_chats — получить список групп, в которых работает бот.\n" message += "+ /chats — получить список групп, в которых работает бот.\n"
message += "+ /squads — получить список отрядов.\n" message += "+ /squads — получить список отрядов.\n"
message += "+ /pin _текст_ — отправить сообщение во все группы, где находится бот. Сообщение будет автоматически запинено.\n" message += "+ /pin _номера чатов_ _текст_ — отправить сообщение в чаты с номерами. Сообщение будет автоматичекси запинено. Пример: \"/pin 2,3,5 привет мир\". Внимание: между номерами чатов ставятся запятые без пробелов! Всё, что идёт после второго пробела в команде — сообщение\n"
message += "+ /pin\\_all _текст_ — отправить сообщение во все группы, где находится бот. Сообщение будет автоматически запинено.\n"
message += "+ /users — просмотреть зарегистрированных пользователей бота\n" message += "+ /users — просмотреть зарегистрированных пользователей бота\n"
} }
message += "+ /help выводит данное сообщение\n" message += "+ /help выводит данное сообщение\n"