Skip to content

Commit a924e7d

Browse files
authored
Merge pull request #8 from ScriptArts/wip-replacement-code
Replace product code. TODO リファクタリングとテストコード 使い方詳細など
2 parents 5f23d95 + 50cd6cd commit a924e7d

20 files changed

+998
-227
lines changed

.env.template

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
DISCORD_TASK_MANAGEMENT_DIR=
2+
DISCORD_BOT_TOKEN=
3+
DISCORD_TASK_MANAGEMENT_DATABASE_TYPE=sqlite3
4+
DISCORD_TASK_MANAGEMENT_DATABASE_CONNECTION_STR=app.db
5+
DISCORD_BOT_OP_LIST=
6+
DISCORD_BOT_DEBUG=true

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@
1212
*.out
1313
.idea
1414
vendor
15-
.env
15+
.env
16+
*.db

.travis.yml

Lines changed: 0 additions & 8 deletions
This file was deleted.

Gopkg.lock

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,25 @@
11
# DiscordTaskManagementBot
2-
[![Build Status](https://travis-ci.com/ScriptArts/DiscordTaskManagementBot.svg?branch=master)](https://travis-ci.com/ScriptArts/DiscordTaskManagementBot)
3-
[![codecov](https://codecov.io/gh/ScriptArts/DiscordTaskManagementBot/branch/master/graph/badge.svg)](https://codecov.io/gh/ScriptArts/DiscordTaskManagementBot)
4-
52

63
個人にメンションされたタスクの管理ボット
4+
5+
- env
6+
7+
`.env.template` をもとに、`.env`ファイルを作成する。
8+
9+
```
10+
# envファイル存在するディレクトリへのPath
11+
DISCORD_TASK_MANAGEMENT_DIR=
12+
# DiscordBotのトークン
13+
DISCORD_BOT_TOKEN=
14+
# データベースタイプ (sqlite3, pg, mysql, mssql)
15+
DISCORD_TASK_MANAGEMENT_DATABASE_TYPE=sqlite3
16+
# データベースの接続文字列
17+
DISCORD_TASK_MANAGEMENT_DATABASE_CONNECTION_STR=app.db
18+
# クリエイター追加コマンドなどの管理者コマンド実行権限(DiscordのユーザID)
19+
# ex) 11111111,22222222
20+
DISCORD_BOT_OP_LIST=
21+
# デバックモードの時は true にする。
22+
DISCORD_BOT_DEBUG=true
23+
```
24+
25+
`go run server.go` or (`go build server.go` and run binary file)

bot/creator.go

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
package bot
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"github.com/ScriptArts/DiscordTaskManagementBot/models"
7+
"github.com/ScriptArts/DiscordTaskManagementBot/utils"
8+
"github.com/bwmarrin/discordgo"
9+
"time"
10+
)
11+
12+
type CreatorCommand struct {
13+
BaseCommand
14+
}
15+
16+
// $creator
17+
// $creator list # クリエイターをすべて取得
18+
// $creator add <@xxxxxx> # クリエイターを追加
19+
// $creator remove <uuid> #クリエイターを削除(紐づく依頼があれば削除に失敗する)
20+
// $creator remove <uuid> -f #クリエイターを削除(紐づく依頼もすべて削除する)
21+
func (c *CreatorCommand) Run(params []string, s *discordgo.Session, m *discordgo.MessageCreate) error {
22+
c.session = s
23+
c.messageCreate = m
24+
25+
// コマンドヘルプ
26+
if len(params) == 1 {
27+
return c.Help()
28+
}
29+
30+
var err error
31+
32+
p := params[1]
33+
switch p {
34+
case "list":
35+
err = c.List()
36+
case "add":
37+
err = c.Add(m.Mentions)
38+
break
39+
case "remove":
40+
if len(params) < 3 {
41+
return errors.New("正しいコマンドを入力してください")
42+
}
43+
44+
uid := params[2]
45+
forceDelete := false
46+
if len(params) > 3 && params[3] == "-f" {
47+
forceDelete = true
48+
}
49+
50+
err = c.Remove(uid, forceDelete)
51+
break
52+
}
53+
54+
return err
55+
}
56+
57+
func (c *CreatorCommand) Help() error {
58+
embed := &discordgo.MessageEmbed{
59+
Author: &discordgo.MessageEmbedAuthor{
60+
Name: "タスク管理ボット",
61+
},
62+
Color: 0x00ff00,
63+
Fields: []*discordgo.MessageEmbedField{
64+
{
65+
Name: "$creator list",
66+
Value: "クリエイター一覧を取得",
67+
},
68+
{
69+
Name: "$creator add @xxxx",
70+
Value: "クリエイターを追加",
71+
},
72+
{
73+
Name: "$creator remove <uuid>",
74+
Value: "クリエイターを削除(依頼がまだ存在している場合は失敗)",
75+
},
76+
{
77+
Name: "$creator remove <uuid> -f",
78+
Value: "クリエイターを削除(関連する依頼も削除)",
79+
},
80+
},
81+
Description: "クリエイターコマンドのヘルプです",
82+
Timestamp: time.Now().Format(time.RFC3339),
83+
Title: "クリエイターコマンド",
84+
}
85+
86+
_, err := c.session.ChannelMessageSendEmbed(c.messageCreate.ChannelID, embed)
87+
return err
88+
}
89+
90+
func (c *CreatorCommand) List() error {
91+
r := new(models.CreatorRepository)
92+
creators, err := r.GetAll(c.messageCreate.GuildID)
93+
if err != nil {
94+
return err
95+
}
96+
97+
embed := &discordgo.MessageEmbed{
98+
Author: &discordgo.MessageEmbedAuthor{
99+
Name: "タスク管理ボット",
100+
},
101+
Color: 0x00ff00,
102+
Fields: []*discordgo.MessageEmbedField{},
103+
Description: "クリエイターの一覧を表示します",
104+
Timestamp: time.Now().Format(time.RFC3339),
105+
Title: "クリエイター",
106+
}
107+
108+
for _, creator := range creators {
109+
embed.Fields = append(embed.Fields, &discordgo.MessageEmbedField{
110+
Name: creator.UUID,
111+
Value: fmt.Sprintf("<@%s>", creator.DiscordID),
112+
})
113+
}
114+
115+
c.session.ChannelMessageSendEmbed(c.messageCreate.ChannelID, embed)
116+
117+
return nil
118+
}
119+
120+
func (c *CreatorCommand) Add(mentions []*discordgo.User) error {
121+
if !utils.IsCanUseOpCommand(c.messageCreate.Author) {
122+
return errors.New("使用できないコマンドです")
123+
}
124+
125+
if len(mentions) == 0 {
126+
return errors.New("メンションが設定されていません")
127+
}
128+
129+
user := mentions[0]
130+
131+
r := new(models.CreatorRepository)
132+
err := r.Create(user.ID, c.messageCreate.GuildID)
133+
if err != nil {
134+
return err
135+
}
136+
137+
str := fmt.Sprintf("%s <@%s> を追加しました", user.Username, user.ID)
138+
c.session.ChannelMessageSend(c.messageCreate.ChannelID, str)
139+
140+
return nil
141+
}
142+
143+
func (c *CreatorCommand) Remove(uid string, forceDelete bool) error {
144+
if !utils.IsCanUseOpCommand(c.messageCreate.Author) {
145+
return errors.New(fmt.Sprintf("<@%s> 使用できないコマンドです", c.messageCreate.Author.ID))
146+
}
147+
148+
r := new(models.CreatorRepository)
149+
creator, err := r.Get(uid, c.messageCreate.GuildID)
150+
if err != nil {
151+
return err
152+
}
153+
154+
err = r.Remove(creator.DiscordID, c.messageCreate.GuildID, forceDelete)
155+
if err != nil {
156+
return err
157+
}
158+
159+
str := fmt.Sprintf("<@%s> クリエイター「<@%s>」 を削除しました", c.messageCreate.Author.ID, creator.DiscordID)
160+
c.session.ChannelMessageSend(c.messageCreate.ChannelID, str)
161+
162+
return nil
163+
}

bot/discord_test.go

Lines changed: 0 additions & 39 deletions
This file was deleted.

bot/mention_handler.go

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,53 @@
11
package bot
22

33
import (
4+
"fmt"
45
"github.com/bwmarrin/discordgo"
6+
"github.com/txgruppi/parseargs-go"
57
"log"
8+
"strings"
69
)
710

11+
type BaseCommand struct {
12+
session *discordgo.Session
13+
messageCreate *discordgo.MessageCreate
14+
}
15+
16+
type CommandInterface interface {
17+
Run(params []string, s *discordgo.Session, m *discordgo.MessageCreate) error
18+
}
19+
820
// 誰かがメッセージを投稿したときのハンドラー
921
func MentionHandler(s *discordgo.Session, m *discordgo.MessageCreate) {
10-
mentions := m.Mentions
11-
if len(mentions) != 1 {
22+
c := m.Content
23+
if !strings.HasPrefix(c, "$") {
1224
return
1325
}
1426

15-
log.Println("[Single mention]", m.Author.Username, m.Content)
27+
log.Println(m.GuildID)
28+
29+
parsed, err := parseargs.Parse(c)
30+
if err != nil {
31+
log.Fatal(err)
32+
}
33+
34+
var cmd CommandInterface
35+
36+
switch parsed[0] {
37+
case "$creator":
38+
cmd = &CreatorCommand{}
39+
case "$request":
40+
cmd = &RequestCommand{}
41+
break
42+
}
43+
44+
if cmd != nil {
45+
err = cmd.Run(parsed, s, m)
46+
}
47+
48+
if err != nil {
49+
log.Println(err.Error())
50+
s.ChannelMessageSend(m.ChannelID, fmt.Sprintf("<@%s> %s", m.Author.ID, err.Error()))
51+
}
52+
//log.Println("[Single mention]", m.Author.Username, m.Content)
1653
}

0 commit comments

Comments
 (0)