Added subday module with a subday handlers

This commit is contained in:
Alex Vanin 2019-05-10 15:16:35 +03:00
parent bb26c57985
commit 8ba3b08ed1
7 changed files with 273 additions and 22 deletions

View file

@ -5,6 +5,7 @@ import (
"log"
"galched-bot/modules/settings"
"galched-bot/modules/subday"
"github.com/bwmarrin/discordgo"
"github.com/pkg/errors"
@ -18,7 +19,7 @@ type (
}
)
func New(s *settings.Settings) (*Discord, error) {
func New(s *settings.Settings, subday *subday.Subday) (*Discord, error) {
key := fmt.Sprintf("Bot %s", s.DiscordToken)
instance, err := discordgo.New(key)
if err != nil {
@ -26,6 +27,9 @@ func New(s *settings.Settings) (*Discord, error) {
}
processor := NewProcessor(s.Version)
for _, subdayHandler := range SubdayHandlers(subday, s.PermittedRoles) {
processor.AddHandler(subdayHandler)
}
log.Printf("discord: added %d message handlers", len(processor.handlers))
if len(processor.handlers) > 0 {
@ -45,6 +49,13 @@ func LogMessage(m *discordgo.MessageCreate) {
log.Printf("discord: msg [%s]: %s", m.Author.Username, m.Content)
}
func SendMessage(s *discordgo.Session, m *discordgo.MessageCreate, text string) {
_, err := s.ChannelMessageSend(m.ChannelID, text)
if err != nil {
log.Printf("discord: cannot send message [%s]: %v", text, err)
}
}
func (d *Discord) Start() error {
d.session.AddHandler(d.processor.Process)
return d.session.Open()

View file

@ -0,0 +1,150 @@
package discord
import (
"fmt"
"log"
"strings"
"galched-bot/modules/subday"
"github.com/bwmarrin/discordgo"
)
type SubdayListHandler struct {
subday *subday.Subday
}
func (h *SubdayListHandler) Signature() string {
return "!sublist"
}
func (h *SubdayListHandler) Description() string {
return "список игр для сабдея"
}
func (h *SubdayListHandler) IsValid(msg string) bool {
return msg == "!sublist"
}
func (h *SubdayListHandler) Handle(s *discordgo.Session, m *discordgo.MessageCreate) {
h.subday.RLock()
defer h.subday.RUnlock()
LogMessage(m)
c, err := s.State.Channel(m.ChannelID)
if err != nil {
log.Print("discord: cannot obtain state", err)
return
}
g, err := s.State.Guild(c.GuildID)
if err != nil {
log.Print("discord: cannot obtain guild", err)
return
}
message := "Игры предыдущих сабдеев:\n**20.10.18**: _DmC_ -> _Fable 1_ -> _Overcooked 2_\n" +
"**17.11.18**: _The Witcher_ -> _Xenus: Белое Золото_ -> _NFS: Underground 2_\n" +
"**22.12.18**: _True Crime: Streets of LA_ -> _Serious Sam 3_ -> _Kholat_\n" +
"**26.01.19**: _Disneys Aladdin_ -> _~~Gothic~~_ -> _Scrapland_ -> _Donut County_\n\n" +
"Список игр для следующего сабдея:\n"
for k, v := range h.subday.Database() {
nickname := " "
for _, member := range g.Members {
if k == member.User.ID {
if member.Nick != "" {
nickname = member.Nick
} else {
nickname = member.User.Username
}
}
}
for _, game := range v {
message += fmt.Sprintf(" **- %s** от _%s_\n", game, nickname)
}
}
_, err = s.ChannelMessageSend(m.ChannelID, strings.Trim(message, "\n"))
if err != nil {
log.Printf("discord: cannot send message [%s]: %v", message, err)
}
}
type SubdayAddHandler struct {
subday *subday.Subday
roles []string
}
func (h *SubdayAddHandler) Signature() string {
return "!subday <game-name>"
}
func (h *SubdayAddHandler) Description() string {
return "добавление игры в список сабдея"
}
func (h *SubdayAddHandler) IsValid(msg string) bool {
return strings.HasPrefix(msg, "!subday")
}
func (h *SubdayAddHandler) Handle(s *discordgo.Session, m *discordgo.MessageCreate) {
h.subday.Lock()
defer h.subday.Unlock()
LogMessage(m)
c, err := s.State.Channel(m.ChannelID)
if err != nil {
log.Print("discord: cannot obtain state", err)
return
}
g, err := s.State.Guild(c.GuildID)
if err != nil {
log.Print("discord: cannot obtain guild", err)
return
}
member, err := s.State.Member(g.ID, m.Author.ID)
if err != nil {
log.Print("discord: cannot obtain user role", err)
return
}
if g.Name != "AV" && g.Name != "Galched" {
log.Printf("discord: message from unsupported guild %s, ignore", g.Name)
return
}
permissionGranted := false
loop:
for i := range member.Roles {
for j := range h.roles {
if member.Roles[i] == h.roles[j] {
permissionGranted = true
break loop
}
}
}
if permissionGranted {
game := strings.Trim(strings.Replace(m.Content, "!subday", "", 1), " ")
if game != "" {
gameList, ok := h.subday.Database()[m.Author.ID]
if ok && len(gameList) > 10 {
SendMessage(s, m, "Нельзя заказать больше 10 игр")
return
} else if ok {
for i := range gameList {
if game == gameList[i] {
SendMessage(s, m, "Эта игра уже заказана вами")
return
}
}
}
h.subday.Database()[m.Author.ID] = append(h.subday.Database()[m.Author.ID], game)
log.Printf("subday: game [%s] is added to subday database", game)
SendMessage(s, m, fmt.Sprintf("Игра \"%s\" добавлена в список", game))
h.subday.DumpToFile()
}
} else {
log.Print("subday: game is not added, insufficient rights")
SendMessage(s, m, "Заказ игр для сабдея доступен только для подписчиков канала (и Нифлая)")
}
}
func SubdayHandlers(s *subday.Subday, r []string) []MessageHandler {
var result []MessageHandler
addHandler := &SubdayAddHandler{s, r}
listHandler := &SubdayListHandler{s}
return append(result, addHandler, listHandler)
}

View file

@ -6,20 +6,20 @@ import (
type testHandler struct{}
var _ = (testHandler)(nil) // ignore unused warning
var _ = testHandler{} // ignore unused warning
func (t *testHandler) Signature() string {
func (h *testHandler) Signature() string {
return "!test"
}
func (t *testHandler) Description() string {
func (h *testHandler) Description() string {
return "тестовый хэндлер"
}
func (t *testHandler) IsValid(msg string) bool {
func (h *testHandler) IsValid(msg string) bool {
return msg == "!test"
}
func (t *testHandler) Handle(s *discordgo.Session, m *discordgo.MessageCreate) {
func (h *testHandler) Handle(s *discordgo.Session, m *discordgo.MessageCreate) {
LogMessage(m)
}