Skip to content

Commit

Permalink
Merge pull request #8 from ScriptArts/wip-replacement-code
Browse files Browse the repository at this point in the history
Replace product code.

TODO
リファクタリングとテストコード
使い方詳細など
  • Loading branch information
yk-hongu authored Mar 3, 2019
2 parents 5f23d95 + 50cd6cd commit a924e7d
Show file tree
Hide file tree
Showing 20 changed files with 998 additions and 227 deletions.
6 changes: 6 additions & 0 deletions .env.template
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@
*.out
.idea
vendor
.env
.env
*.db
8 changes: 0 additions & 8 deletions .travis.yml

This file was deleted.

18 changes: 18 additions & 0 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 22 additions & 3 deletions README.md
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)
163 changes: 163 additions & 0 deletions bot/creator.go
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
}
39 changes: 0 additions & 39 deletions bot/discord_test.go

This file was deleted.

43 changes: 40 additions & 3 deletions bot/mention_handler.go
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)
}
Loading

0 comments on commit a924e7d

Please sign in to comment.