Archived
1

Reminders for league. Now just reminders, without attack button

This commit is contained in:
2017-12-23 01:40:36 +04:00
parent a2e70332de
commit 706dc3e944
19 changed files with 381 additions and 117 deletions

30
lib/reminder/exported.go Normal file
View 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
View 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
}

View 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()
}

View 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
View 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
View 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"
}