Skip to content

Commit

Permalink
Merge pull request #6 from ebiiim/feat-routelist
Browse files Browse the repository at this point in the history
add route-print command
  • Loading branch information
ebiiim authored Dec 25, 2023
2 parents 936761e + 262756e commit 6ef1642
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 36 deletions.
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,10 @@ Albion Onlineのギルド [Dog The Boston](https://twitter.com/DogTheBoston) 用
> - `/help` このメッセージを表示します。
> - `/mule` ラバに関するヒントをランダムに投稿します(30秒後に自動削除)。
> - `/route-add` アバロンのルートを追加します。
> - `/route-print` アバロンのルートを画像で投稿します。
> - `/route-clear` アバロンのルートをリセットします。
> - `/route-mark` マップの色を変えたりメモを載せたりします。
> - `/route-list` いま持ってる情報を表示します(確認)。
> - `/route-print` アバロンのルートを画像で投稿します(共有)。
> - `/route-clear` アバロンのルートをリセットします。
> ## リアクション
> - `リアクション集計` 集計したいメッセージにリアクション(🤖)を行うとリマインダーを投稿します(2分後に自動削除)。
> ## おまけ
Expand All @@ -48,6 +49,8 @@ Albion Onlineのギルド [Dog The Boston](https://twitter.com/DogTheBoston) 用

## リリースノート

- 202x-xx-xx v1.8.0
- 機能: `ルートナビ` 確認用コマンド `/route-list` を追加
- 2023-12-24 v1.7.0
- 改善: `ルートナビ` `/route-clear` 時にバックアップを取得&マークは削除せずルートだけを削除するようにした
- 機能: `ルートナビ` `/route-mark` にユーザ名を追加(情報提供目的)
Expand Down Expand Up @@ -115,6 +118,7 @@ Albion Onlineのギルド [Dog The Boston](https://twitter.com/DogTheBoston) 用
- 機能: 会話AIほしくない?
- 改善: 情報やエラーメッセージをembedでキレイに表示したい
- 内部: マルチインスタンス対応({リアクション|メンション}ハンドラのGuild ID対応)
- 機能: `/route-clear` にundoほしくない?(ほぼ使われていないので優先度低)

## ライセンス

Expand Down
6 changes: 4 additions & 2 deletions pkg/bot/bot.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,18 +47,20 @@ func New(cfg Config) (*Bot, error) {
handlers.AppCmdHelp,
handlers.AppCmdMule,
roaNavHandler.CommandRouteAdd(),
roaNavHandler.CommandRouteMark(),
roaNavHandler.CommandRouteList(),
roaNavHandler.CommandRoutePrint(),
roaNavHandler.CommandRouteClear(),
roaNavHandler.CommandRouteMark(),
}

cmdHandlers := map[string]func(s *discordgo.Session, i *discordgo.InteractionCreate){
handlers.CmdHelp: handlers.HandleCmdHelp,
handlers.CmdMule: handlers.HandleCmdMule,
handlers.CmdRouteAdd: roaNavHandler.HandleCmdRouteAdd,
handlers.CmdRouteMark: roaNavHandler.HandleCmdRouteMark,
handlers.CmdRouteList: roaNavHandler.HandleCmdRouteList,
handlers.CmdRoutePrint: roaNavHandler.HandleCmdRoutePrint,
handlers.CmdRouteClear: roaNavHandler.HandleCmdRouteClear,
handlers.CmdRouteMark: roaNavHandler.HandleCmdRouteMark,
}

reactionAddHandlers := map[string]func(s *discordgo.Session, r *discordgo.MessageReactionAdd){}
Expand Down
1 change: 1 addition & 0 deletions pkg/handlers/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const (
CmdRoutePrint = "route-print"
CmdRouteClear = "route-clear"
CmdRouteMark = "route-mark"
CmdRouteList = "route-list"
CmdActReqMsg = "message"

FuncMessageCreateSayHello = "message-create/say-hello"
Expand Down
5 changes: 3 additions & 2 deletions pkg/handlers/slashcmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,10 @@ func HandleCmdHelp(s *discordgo.Session, i *discordgo.InteractionCreate) {
"- `/help` このメッセージを表示します。\n" +
"- `/mule` ラバに関するヒントをランダムに投稿します(30秒後に自動削除)。\n" +
"- `/route-add` アバロンのルートを追加します。\n" +
"- `/route-print` アバロンのルートを画像で投稿します。\n" +
"- `/route-clear` アバロンのルートをリセットします。\n" +
"- `/route-mark` マップの色を変えたりメモを載せたりします。\n" +
"- `/route-list` いま持ってる情報を表示します(確認)。\n" +
"- `/route-print` アバロンのルートを画像で投稿します(共有)。\n" +
"- `/route-clear` アバロンのルートをリセットします。\n" +
"## リアクション\n" +
"- **リアクション集計** 集計したいメッセージにリアクション(" + emojis2msg(guildEmojis, EmojisReactionAddReactionRequired) + ")を行うとリマインダーを投稿します(2分後に自動削除)。\n" +
// "- [試験運用中] **リアクション集計(表)** 集計したいメッセージにリアクション(" + emojis2msg(guildEmojis, emojisReactionAddReactionStats) + ")を行うと表形式で投稿します(2分後に削除)。\n" +
Expand Down
123 changes: 93 additions & 30 deletions pkg/handlers/slashcmd_roanav.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"fmt"
"io"
"os"
"strings"
"sync"
"time"

Expand Down Expand Up @@ -126,6 +125,7 @@ func (h *ROANavHandler) Load() error {
return nil
}

// GetOrCreateNavigation always returns a non-nil value.
func (h *ROANavHandler) GetOrCreateNavigation(name string) *roanav.Navigation {
if v, ok := h.navigations.Load(name); ok {
return v.(*roanav.Navigation)
Expand Down Expand Up @@ -230,6 +230,60 @@ func getNavNameAndUserName(s *discordgo.Session, i *discordgo.InteractionCreate)
return
}

func (h *ROANavHandler) HandleCmdRouteList(s *discordgo.Session, i *discordgo.InteractionCreate) {
lg := lg.With().Str(lkCmd, CmdRouteList).Str(lkIID, i.ID).Logger()

// Get names.
navName, _, err := getNavNameAndUserName(s, i)
if err != nil {
lg.Error().Err(err).Msg("could not get navigation name or user name")
if mErr := respondEphemeralMessage(s, i, fmt.Sprintf("エラー: サーバーかユーザーの名前が取得できなかったわん。何回も発生する場合は管理者に知らせてほしいわん。 ```\n%v```", err)); mErr != nil {
lg.Error().Err(mErr).Msg("could not send InteractionResponse")
}
return
}
lg = lg.With().Str("navName", navName).Logger()

// Get the Navigation.
nav := h.GetOrCreateNavigation(navName)
nav.DeleteExpiredPortals()

// Get MarkedMaps.
var markedMaps []roanav.MarkedMap
if err := json.Unmarshal([]byte(nav.Data[roanav.NavigationDataMarkedMaps]), &markedMaps); err != nil {
lg.Error().Err(err).Msg("could not unmarshal marked maps")
if mErr := respondEphemeralMessage(s, i, fmt.Sprintf("エラー: マークされているマップの取得に失敗したわん。何回も発生する場合は管理者に知らせてほしいわん。 ```\n%v```", err)); mErr != nil {
lg.Error().Err(mErr).Msg("could not send InteractionResponse")
}
return
}

// Construct response.
var resp string
resp += "いまこんな感じだわん! `/route-add` でルートを追加、 `/route-mark` でコメント、 `/route-print` で画像を投稿するわん!\n"
resp += "\n"
resp += "***有効なルート***\n"
srt := roanav.BriefNavigation(nav, data.Maps)
if srt == "" {
resp += "(なし)\n"
} else {
resp += srt
}
resp += "\n"
resp += "***マークされているマップ***\n"
smm := briefMarkedMaps(markedMaps)
if smm == "" {
resp += "(なし)\n"
} else {
resp += smm
}

// Send response.
if mErr := respondEphemeralMessage(s, i, resp); mErr != nil {
lg.Error().Err(mErr).Msg("could not send InteractionResponse")
}
}

func (h *ROANavHandler) HandleCmdRouteAddCommand(s *discordgo.Session, i *discordgo.InteractionCreate) {
lg := lg.With().Str(lkCmd, CmdRouteAdd).Str(lkIID, i.ID).Logger()

Expand Down Expand Up @@ -306,7 +360,7 @@ func (h *ROANavHandler) HandleCmdRouteAddCommand(s *discordgo.Session, i *discor
}

if mErr := respondEphemeralMessage(s, i,
fmt.Sprintf("追加したわん!いまこんな感じ!\n%s`/route-print` で画像を投稿できるわん!", roanav.BriefNavigation(nav, data.Maps)),
"ありがとうわん! `/route-list` で確認、 `/route-print` で画像を投稿してみんなと共有するわん!",
); mErr != nil {
lg.Error().Err(mErr).Msg("could not send InteractionResponse")
}
Expand Down Expand Up @@ -519,6 +573,31 @@ func upsertOrRemoveMarkedMap(markedMaps []roanav.MarkedMap, markedMap roanav.Mar
return m2
}

// briefMarkedMaps returns a string representation of marked maps for printing.
func briefMarkedMaps(markedMaps []roanav.MarkedMap) string {
markedMapsStr := ""
for _, m := range markedMaps {
md, ok := data.Maps[m.ID]
if !ok {
continue
}
markedMapsStr += fmt.Sprintf("- %s", md.DisplayName)
if m.Color != roanav.MarkedMapColorNone {
markedMapsStr += fmt.Sprintf(" (%s)", m.Color)
}
if m.Comment != "" {
markedMapsStr += fmt.Sprintf(" \"%s\"", m.Comment)
}
if m.User != "" {
markedMapsStr += fmt.Sprintf(" by %s", m.User)
} else {
markedMapsStr += " by ユーザ情報なし" // for backward compatibility
}
markedMapsStr += "\n"
}
return markedMapsStr
}

func (h *ROANavHandler) HandleCmdRouteMarkCommand(s *discordgo.Session, i *discordgo.InteractionCreate) {
lg := lg.With().Str(lkCmd, CmdRouteMark).Str(lkIID, i.ID).Logger()

Expand Down Expand Up @@ -596,40 +675,24 @@ func (h *ROANavHandler) HandleCmdRouteMarkCommand(s *discordgo.Session, i *disco
lg.Error().Err(err).Msg("could not save navigations")
}

// String representation.
markedMapsStr := ""
for _, m := range markedMaps {
md, ok := data.Maps[m.ID]
if !ok {
continue
}
markedMapsStr += fmt.Sprintf("- %s", md.DisplayName)
if m.Color != roanav.MarkedMapColorNone {
markedMapsStr += fmt.Sprintf(" (%s)", m.Color)
}
if m.Comment != "" {
markedMapsStr += fmt.Sprintf(" \"%s\"", m.Comment)
}
if m.User != "" {
markedMapsStr += fmt.Sprintf(" by %s", m.User)
} else {
markedMapsStr += " by UNKNOWN_USER" // for backward compatibility
}
markedMapsStr += "\n"
}
markedMapsStr = strings.TrimSuffix(markedMapsStr, "\n")

if mErr := respondEphemeralMessage(s, i,
fmt.Sprintf("対象をマークまたはアンマークしたわん!現在マークされているマップはこんな感じわん\n%s", markedMapsStr),
"わかったわん! `/route-list` でいまの状態を確認できるわん\n",
); mErr != nil {
lg.Error().Err(mErr).Msg("could not send InteractionResponse")
}
}

func (*ROANavHandler) CommandRouteList() *discordgo.ApplicationCommand {
return &discordgo.ApplicationCommand{
Name: CmdRouteList,
Description: "こんぶくんに知ってる情報をこっそり教えてもらう(確認用)",
}
}

func (*ROANavHandler) CommandRouteAdd() *discordgo.ApplicationCommand {
return &discordgo.ApplicationCommand{
Name: CmdRouteAdd,
Description: "こんぶくんにアバロンのルートを覚えてもらう",
Description: "こんぶくんにアバロンのルートを覚えてもらう(チャンネルごとに分かれてるよ!)",
Options: []*discordgo.ApplicationCommandOption{
{
Name: "from",
Expand Down Expand Up @@ -676,21 +739,21 @@ func (*ROANavHandler) CommandRouteAdd() *discordgo.ApplicationCommand {
func (*ROANavHandler) CommandRoutePrint() *discordgo.ApplicationCommand {
return &discordgo.ApplicationCommand{
Name: CmdRoutePrint,
Description: "こんぶくんに覚えているアバロンのルートを画像で投稿してもらう",
Description: "こんぶくんに覚えているアバロンのルートを画像でチャンネルに投稿してもらう(みんなに共有!)",
}
}

func (*ROANavHandler) CommandRouteClear() *discordgo.ApplicationCommand {
return &discordgo.ApplicationCommand{
Name: CmdRouteClear,
Description: "こんぶくんに覚えているアバロンのルートを全部忘れてもらう",
Description: "[取扱注意] こんぶくんに覚えているアバロンのルートを全部忘れてもらう(リセット機能)",
}
}

func (*ROANavHandler) CommandRouteMark() *discordgo.ApplicationCommand {
return &discordgo.ApplicationCommand{
Name: CmdRouteMark,
Description: "こんぶくんに特別なマップに色をつけてもらう(再実行で解除)",
Description: "こんぶくんに特別なマップに色をつけてもらう",
Options: []*discordgo.ApplicationCommandOption{
{
Name: "map",
Expand Down

0 comments on commit 6ef1642

Please sign in to comment.