Reminders for league. Now just reminders, without attack button
This commit is contained in:
30
lib/reminder/exported.go
Normal file
30
lib/reminder/exported.go
Normal file
@@ -0,0 +1,30 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package reminder
|
||||
|
||||
import (
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/appcontext"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/reminder/reminderinterface"
|
||||
)
|
||||
|
||||
var (
|
||||
c *appcontext.Context
|
||||
)
|
||||
|
||||
// Reminder is a function-handling struct for Reminder
|
||||
type Reminder struct{}
|
||||
|
||||
// New is a appcontext initialization function
|
||||
func New(ac *appcontext.Context) {
|
||||
c = ac
|
||||
r := &Reminder{}
|
||||
c.RegisterReminderInterface(reminderinterface.ReminderInterface(r))
|
||||
}
|
||||
|
||||
// Init is an initialization function for reminder
|
||||
func (r *Reminder) Init() {
|
||||
c.Log.Info("Initializing Reminder...")
|
||||
|
||||
c.Cron.AddFunc("0 55 0-23/2 * * *", r.SendReminders)
|
||||
}
|
73
lib/reminder/reminder.go
Normal file
73
lib/reminder/reminder.go
Normal file
@@ -0,0 +1,73 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package reminder
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func (r *Reminder) getRemindersForUser(playerRaw *dbmapping.Player) ([]dbmapping.Alarm, bool) {
|
||||
alarmsList := []dbmapping.Alarm{}
|
||||
|
||||
err := c.Db.Select(&alarmsList, "SELECT * FROM alarms WHERE player_id=?", playerRaw.ID)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
return alarmsList, false
|
||||
}
|
||||
|
||||
return alarmsList, true
|
||||
}
|
||||
|
||||
func (r *Reminder) formatRemindersButtons(playerRaw *dbmapping.Player) tgbotapi.InlineKeyboardMarkup {
|
||||
currentAlarms, _ := r.getRemindersForUser(playerRaw)
|
||||
|
||||
alarmExist := make(map[string]string)
|
||||
for i := range currentAlarms {
|
||||
alarmExist[strconv.Itoa(currentAlarms[i].TurnirNumber)] = "enabled"
|
||||
}
|
||||
|
||||
keyboard := tgbotapi.InlineKeyboardMarkup{}
|
||||
rows := make(map[int][]tgbotapi.InlineKeyboardButton)
|
||||
rows[0] = []tgbotapi.InlineKeyboardButton{}
|
||||
rows[1] = []tgbotapi.InlineKeyboardButton{}
|
||||
rows[2] = []tgbotapi.InlineKeyboardButton{}
|
||||
for i := 1; i <= 12; i++ {
|
||||
hours := 2 * (i - 1)
|
||||
if alarmExist[strconv.Itoa(i)] != "" {
|
||||
hoursStr := "✅ "
|
||||
hoursStr += strconv.Itoa(hours) + ":55"
|
||||
btn := tgbotapi.NewInlineKeyboardButtonData(hoursStr, "disable_reminder_"+strconv.Itoa(i))
|
||||
rows[(i-1)/4] = append(rows[(i-1)/4], btn)
|
||||
} else {
|
||||
hoursStr := "🚫 "
|
||||
hoursStr += strconv.Itoa(hours) + ":55"
|
||||
btn := tgbotapi.NewInlineKeyboardButtonData(hoursStr, "enable_reminder_"+strconv.Itoa(i))
|
||||
rows[(i-1)/4] = append(rows[(i-1)/4], btn)
|
||||
}
|
||||
}
|
||||
|
||||
for i := range rows {
|
||||
keyboard.InlineKeyboard = append(keyboard.InlineKeyboard, rows[i])
|
||||
}
|
||||
|
||||
return keyboard
|
||||
}
|
||||
|
||||
func (r *Reminder) formatRemindersMessageText(playerRaw *dbmapping.Player) string {
|
||||
message := "*Ваши напоминания о битвах:*\n"
|
||||
message += "За пять минут до битвы бот может присылать вам в личные сообщения напоминание о том, "
|
||||
message += "что битва скоро состоится, и стоит встать на атаку.\n"
|
||||
message += "Кнопками ниже вы можете настроить, к каким из битв вас оповещать. Время московское.\n\n"
|
||||
|
||||
currentAlarms, ok := r.getRemindersForUser(playerRaw)
|
||||
if !ok {
|
||||
message += "Не удалось получить настройки оповещений из базы. Ошибка."
|
||||
} else {
|
||||
message += "Установлено оповещений: " + strconv.Itoa(len(currentAlarms))
|
||||
}
|
||||
|
||||
return message
|
||||
}
|
21
lib/reminder/reminderinterface/reminderinterface.go
Normal file
21
lib/reminder/reminderinterface/reminderinterface.go
Normal file
@@ -0,0 +1,21 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package reminderinterface
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
)
|
||||
|
||||
// ReminderInterface implements Reminder for importing via appcontext
|
||||
type ReminderInterface interface {
|
||||
Init()
|
||||
|
||||
AlarmsList(update *tgbotapi.Update, playerRaw *dbmapping.Player) string
|
||||
|
||||
CreateAlarmSetting(update *tgbotapi.Update, playerRaw *dbmapping.Player) string
|
||||
DestroyAlarmSetting(update *tgbotapi.Update, playerRaw *dbmapping.Player) string
|
||||
|
||||
SendReminders()
|
||||
}
|
25
lib/reminder/responders.go
Normal file
25
lib/reminder/responders.go
Normal file
@@ -0,0 +1,25 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package reminder
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
)
|
||||
|
||||
// AlarmsList lists all alarms for user with buttons to enable/disable each of available alarms
|
||||
func (r *Reminder) AlarmsList(update *tgbotapi.Update, playerRaw *dbmapping.Player) string {
|
||||
msg := tgbotapi.MessageConfig{}
|
||||
msg.Text = r.formatRemindersMessageText(playerRaw)
|
||||
msg.ParseMode = "Markdown"
|
||||
msg.ChatID = update.Message.Chat.ID
|
||||
|
||||
remindersMsg, _ := c.Bot.Send(msg)
|
||||
|
||||
keyboard := r.formatRemindersButtons(playerRaw)
|
||||
buttonsUpdate := tgbotapi.NewEditMessageReplyMarkup(update.Message.Chat.ID, remindersMsg.MessageID, keyboard)
|
||||
c.Bot.Send(buttonsUpdate)
|
||||
|
||||
return "ok"
|
||||
}
|
32
lib/reminder/sender.go
Normal file
32
lib/reminder/sender.go
Normal file
@@ -0,0 +1,32 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package reminder
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"time"
|
||||
)
|
||||
|
||||
// SendReminders sends reminders for users about coming league tournament
|
||||
func (r *Reminder) SendReminders() {
|
||||
currentHour := time.Now().Hour()
|
||||
nextTournamentID := (currentHour / 2) + 1
|
||||
|
||||
playersRaw := []dbmapping.Player{}
|
||||
err := c.Db.Select(&playersRaw, "SELECT p.* FROM players p, alarms a WHERE a.turnir_number=? AND a.player_id = p.id GROUP BY p.id", nextTournamentID)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
}
|
||||
|
||||
for i := range playersRaw {
|
||||
message := "*Турнир Лиг покемемов состоится через пять минут!*\n"
|
||||
message += "Вперёд, за опытом и деньгами! Выстави атаку и жди результата!"
|
||||
|
||||
msg := tgbotapi.NewMessage(int64(playersRaw[i].TelegramID), message)
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
}
|
||||
}
|
60
lib/reminder/updaters.go
Normal file
60
lib/reminder/updaters.go
Normal file
@@ -0,0 +1,60 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package reminder
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// CreateAlarmSetting creates alarm setting for user
|
||||
func (r *Reminder) CreateAlarmSetting(update *tgbotapi.Update, playerRaw *dbmapping.Player) string {
|
||||
turnirNumber := strings.TrimPrefix(update.CallbackQuery.Data, "enable_reminder_")
|
||||
turnirNumberInt, err := strconv.Atoi(turnirNumber)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
return "fail"
|
||||
}
|
||||
|
||||
alarm := dbmapping.Alarm{}
|
||||
alarm.PlayerID = playerRaw.ID
|
||||
alarm.TurnirNumber = turnirNumberInt
|
||||
alarm.CreatedAt = time.Now().UTC()
|
||||
|
||||
_, err = c.Db.NamedExec("INSERT INTO `alarms` VALUES(NULL, :player_id, :turnir_number, :created_at)", &alarm)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
return "fail"
|
||||
}
|
||||
|
||||
keyboard := r.formatRemindersButtons(playerRaw)
|
||||
buttonsUpdate := tgbotapi.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, keyboard)
|
||||
c.Bot.Send(buttonsUpdate)
|
||||
|
||||
return "ok"
|
||||
}
|
||||
|
||||
// DestroyAlarmSetting creates alarm setting for user
|
||||
func (r *Reminder) DestroyAlarmSetting(update *tgbotapi.Update, playerRaw *dbmapping.Player) string {
|
||||
turnirNumber := strings.TrimPrefix(update.CallbackQuery.Data, "disable_reminder_")
|
||||
turnirNumberInt, err := strconv.Atoi(turnirNumber)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
return "fail"
|
||||
}
|
||||
|
||||
_, err = c.Db.Exec(c.Db.Rebind("DELETE FROM `alarms` WHERE player_id=? AND turnir_number=?"), playerRaw.ID, turnirNumberInt)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
}
|
||||
|
||||
keyboard := r.formatRemindersButtons(playerRaw)
|
||||
buttonsUpdate := tgbotapi.NewEditMessageReplyMarkup(update.CallbackQuery.Message.Chat.ID, update.CallbackQuery.Message.MessageID, keyboard)
|
||||
c.Bot.Send(buttonsUpdate)
|
||||
|
||||
return "ok"
|
||||
}
|
Reference in New Issue
Block a user