-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #8 from ScriptArts/wip-replacement-code
Replace product code. TODO リファクタリングとテストコード 使い方詳細など
- Loading branch information
Showing
20 changed files
with
998 additions
and
227 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
DISCORD_TASK_MANAGEMENT_DIR= | ||
DISCORD_BOT_TOKEN= | ||
DISCORD_TASK_MANAGEMENT_DATABASE_TYPE=sqlite3 | ||
DISCORD_TASK_MANAGEMENT_DATABASE_CONNECTION_STR=app.db | ||
DISCORD_BOT_OP_LIST= | ||
DISCORD_BOT_DEBUG=true |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,4 +12,5 @@ | |
*.out | ||
.idea | ||
vendor | ||
.env | ||
.env | ||
*.db |
This file was deleted.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,25 @@ | ||
# DiscordTaskManagementBot | ||
[![Build Status](https://travis-ci.com/ScriptArts/DiscordTaskManagementBot.svg?branch=master)](https://travis-ci.com/ScriptArts/DiscordTaskManagementBot) | ||
[![codecov](https://codecov.io/gh/ScriptArts/DiscordTaskManagementBot/branch/master/graph/badge.svg)](https://codecov.io/gh/ScriptArts/DiscordTaskManagementBot) | ||
|
||
|
||
個人にメンションされたタスクの管理ボット | ||
|
||
- env | ||
|
||
`.env.template` をもとに、`.env`ファイルを作成する。 | ||
|
||
``` | ||
# envファイル存在するディレクトリへのPath | ||
DISCORD_TASK_MANAGEMENT_DIR= | ||
# DiscordBotのトークン | ||
DISCORD_BOT_TOKEN= | ||
# データベースタイプ (sqlite3, pg, mysql, mssql) | ||
DISCORD_TASK_MANAGEMENT_DATABASE_TYPE=sqlite3 | ||
# データベースの接続文字列 | ||
DISCORD_TASK_MANAGEMENT_DATABASE_CONNECTION_STR=app.db | ||
# クリエイター追加コマンドなどの管理者コマンド実行権限(DiscordのユーザID) | ||
# ex) 11111111,22222222 | ||
DISCORD_BOT_OP_LIST= | ||
# デバックモードの時は true にする。 | ||
DISCORD_BOT_DEBUG=true | ||
``` | ||
|
||
`go run server.go` or (`go build server.go` and run binary file) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,163 @@ | ||
package bot | ||
|
||
import ( | ||
"errors" | ||
"fmt" | ||
"github.com/ScriptArts/DiscordTaskManagementBot/models" | ||
"github.com/ScriptArts/DiscordTaskManagementBot/utils" | ||
"github.com/bwmarrin/discordgo" | ||
"time" | ||
) | ||
|
||
type CreatorCommand struct { | ||
BaseCommand | ||
} | ||
|
||
// $creator | ||
// $creator list # クリエイターをすべて取得 | ||
// $creator add <@xxxxxx> # クリエイターを追加 | ||
// $creator remove <uuid> #クリエイターを削除(紐づく依頼があれば削除に失敗する) | ||
// $creator remove <uuid> -f #クリエイターを削除(紐づく依頼もすべて削除する) | ||
func (c *CreatorCommand) Run(params []string, s *discordgo.Session, m *discordgo.MessageCreate) error { | ||
c.session = s | ||
c.messageCreate = m | ||
|
||
// コマンドヘルプ | ||
if len(params) == 1 { | ||
return c.Help() | ||
} | ||
|
||
var err error | ||
|
||
p := params[1] | ||
switch p { | ||
case "list": | ||
err = c.List() | ||
case "add": | ||
err = c.Add(m.Mentions) | ||
break | ||
case "remove": | ||
if len(params) < 3 { | ||
return errors.New("正しいコマンドを入力してください") | ||
} | ||
|
||
uid := params[2] | ||
forceDelete := false | ||
if len(params) > 3 && params[3] == "-f" { | ||
forceDelete = true | ||
} | ||
|
||
err = c.Remove(uid, forceDelete) | ||
break | ||
} | ||
|
||
return err | ||
} | ||
|
||
func (c *CreatorCommand) Help() error { | ||
embed := &discordgo.MessageEmbed{ | ||
Author: &discordgo.MessageEmbedAuthor{ | ||
Name: "タスク管理ボット", | ||
}, | ||
Color: 0x00ff00, | ||
Fields: []*discordgo.MessageEmbedField{ | ||
{ | ||
Name: "$creator list", | ||
Value: "クリエイター一覧を取得", | ||
}, | ||
{ | ||
Name: "$creator add @xxxx", | ||
Value: "クリエイターを追加", | ||
}, | ||
{ | ||
Name: "$creator remove <uuid>", | ||
Value: "クリエイターを削除(依頼がまだ存在している場合は失敗)", | ||
}, | ||
{ | ||
Name: "$creator remove <uuid> -f", | ||
Value: "クリエイターを削除(関連する依頼も削除)", | ||
}, | ||
}, | ||
Description: "クリエイターコマンドのヘルプです", | ||
Timestamp: time.Now().Format(time.RFC3339), | ||
Title: "クリエイターコマンド", | ||
} | ||
|
||
_, err := c.session.ChannelMessageSendEmbed(c.messageCreate.ChannelID, embed) | ||
return err | ||
} | ||
|
||
func (c *CreatorCommand) List() error { | ||
r := new(models.CreatorRepository) | ||
creators, err := r.GetAll(c.messageCreate.GuildID) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
embed := &discordgo.MessageEmbed{ | ||
Author: &discordgo.MessageEmbedAuthor{ | ||
Name: "タスク管理ボット", | ||
}, | ||
Color: 0x00ff00, | ||
Fields: []*discordgo.MessageEmbedField{}, | ||
Description: "クリエイターの一覧を表示します", | ||
Timestamp: time.Now().Format(time.RFC3339), | ||
Title: "クリエイター", | ||
} | ||
|
||
for _, creator := range creators { | ||
embed.Fields = append(embed.Fields, &discordgo.MessageEmbedField{ | ||
Name: creator.UUID, | ||
Value: fmt.Sprintf("<@%s>", creator.DiscordID), | ||
}) | ||
} | ||
|
||
c.session.ChannelMessageSendEmbed(c.messageCreate.ChannelID, embed) | ||
|
||
return nil | ||
} | ||
|
||
func (c *CreatorCommand) Add(mentions []*discordgo.User) error { | ||
if !utils.IsCanUseOpCommand(c.messageCreate.Author) { | ||
return errors.New("使用できないコマンドです") | ||
} | ||
|
||
if len(mentions) == 0 { | ||
return errors.New("メンションが設定されていません") | ||
} | ||
|
||
user := mentions[0] | ||
|
||
r := new(models.CreatorRepository) | ||
err := r.Create(user.ID, c.messageCreate.GuildID) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
str := fmt.Sprintf("%s <@%s> を追加しました", user.Username, user.ID) | ||
c.session.ChannelMessageSend(c.messageCreate.ChannelID, str) | ||
|
||
return nil | ||
} | ||
|
||
func (c *CreatorCommand) Remove(uid string, forceDelete bool) error { | ||
if !utils.IsCanUseOpCommand(c.messageCreate.Author) { | ||
return errors.New(fmt.Sprintf("<@%s> 使用できないコマンドです", c.messageCreate.Author.ID)) | ||
} | ||
|
||
r := new(models.CreatorRepository) | ||
creator, err := r.Get(uid, c.messageCreate.GuildID) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
err = r.Remove(creator.DiscordID, c.messageCreate.GuildID, forceDelete) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
str := fmt.Sprintf("<@%s> クリエイター「<@%s>」 を削除しました", c.messageCreate.Author.ID, creator.DiscordID) | ||
c.session.ChannelMessageSend(c.messageCreate.ChannelID, str) | ||
|
||
return nil | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,53 @@ | ||
package bot | ||
|
||
import ( | ||
"fmt" | ||
"github.com/bwmarrin/discordgo" | ||
"github.com/txgruppi/parseargs-go" | ||
"log" | ||
"strings" | ||
) | ||
|
||
type BaseCommand struct { | ||
session *discordgo.Session | ||
messageCreate *discordgo.MessageCreate | ||
} | ||
|
||
type CommandInterface interface { | ||
Run(params []string, s *discordgo.Session, m *discordgo.MessageCreate) error | ||
} | ||
|
||
// 誰かがメッセージを投稿したときのハンドラー | ||
func MentionHandler(s *discordgo.Session, m *discordgo.MessageCreate) { | ||
mentions := m.Mentions | ||
if len(mentions) != 1 { | ||
c := m.Content | ||
if !strings.HasPrefix(c, "$") { | ||
return | ||
} | ||
|
||
log.Println("[Single mention]", m.Author.Username, m.Content) | ||
log.Println(m.GuildID) | ||
|
||
parsed, err := parseargs.Parse(c) | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
|
||
var cmd CommandInterface | ||
|
||
switch parsed[0] { | ||
case "$creator": | ||
cmd = &CreatorCommand{} | ||
case "$request": | ||
cmd = &RequestCommand{} | ||
break | ||
} | ||
|
||
if cmd != nil { | ||
err = cmd.Run(parsed, s, m) | ||
} | ||
|
||
if err != nil { | ||
log.Println(err.Error()) | ||
s.ChannelMessageSend(m.ChannelID, fmt.Sprintf("<@%s> %s", m.Author.ID, err.Error())) | ||
} | ||
//log.Println("[Single mention]", m.Author.Username, m.Content) | ||
} |
Oops, something went wrong.