parent
a6811f61fc
commit
8368a3c60b
@ -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)
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
Reference in New Issue
Block a user