-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
130 lines (105 loc) · 3.73 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package main
import (
"errors"
"fmt"
"log"
"os"
"os/signal"
"time"
"github.com/bwmarrin/discordgo"
)
var token, guestRoleID string
func init() {
token = os.Getenv("DISCORD_TOKEN")
guestRoleID = os.Getenv("GUEST_ROLE_ID")
jst, err := time.LoadLocation("Asia/Tokyo")
if err != nil {
panic(err)
}
time.Local = jst
}
func main() {
dg, err := discordgo.New("Bot " + token)
if err != nil {
log.Println("Error creacting Discord session,", err)
}
// 誰かがjoinした時の処理
// うまくいかない時はDiscord側の設定をしていないかも
// https://github.com/bwmarrin/discordgo/issues/793#issuecomment-659021953 を参照
dg.AddHandler(handleJoin)
// ↑のURLとは違うが、こちらの方が適切(必要以上のデータにアクセスしないため)
dg.Identify.Intents = discordgo.IntentsGuildMembers
err = dg.Open()
if err != nil {
log.Fatalln("Error opening connection,", err)
return
}
log.Println("Bot is now running. Press Ctrl-C to exit")
sc := make(chan os.Signal, 1)
signal.Notify(sc, os.Interrupt)
<-sc
dg.Close()
log.Println("shudown success bye!")
}
func handleJoin(s *discordgo.Session, m *discordgo.GuildMemberAdd) {
if m.User.Bot || (m.User.ID == s.State.User.ID) {
return
}
// 体験入部期間
trialPeriodMonth := 2 /* month */
rawLimitDay := time.Now().AddDate(0, trialPeriodMonth, 0)
roleName := rawLimitDay.Format("2006/01/02")
guild, err := s.Guild(m.GuildID)
if err != nil {
log.Println(err)
return
}
// Guestロールを追加
if err := s.GuildMemberRoleAdd(m.GuildID, m.User.ID, guestRoleID); err != nil {
log.Println(errors.New("Guestロールの付与に失敗しました"))
}
// 体験入部期限ロールを付与 (ex. yyyy/mm/dd)
// 同名のロールがある場合、そのロールを付与(同じ日に複数人が入るとロール名が重複する)
if existSameRole(guild, roleName) {
// 既にロールが存在するため、当該ユーザにそのロールを付与
roleID := getRoleID(guild, roleName)
if err := s.GuildMemberRoleAdd(m.GuildID, m.User.ID, roleID); err != nil {
log.Println(errors.New("既存の体験入部期限ロールの付与に失敗しました"))
return
}
} else {
param := &discordgo.RoleParams{Name: roleName}
role, err := s.GuildRoleCreate(m.GuildID, param)
if err != nil {
log.Println(errors.New("新規体験入部期限ロールの作成に失敗しました"))
return
}
if _, err := s.GuildRoleEdit(m.GuildID, role.ID, param); err != nil {
log.Println(errors.New("新規体験入部期限ロールの編集に失敗しました"))
}
if err := s.GuildMemberRoleAdd(m.GuildID, m.User.ID, role.ID); err != nil {
log.Println(errors.New("新規体験入部期限ロールの付与に失敗しました"))
}
}
// joinチャンネルにようこそメッセージと、体験入部期間を通知
if _, err := s.ChannelMessageSend(guild.SystemChannelID, welcomeMessageContent(m.Mention(), roleName)); err != nil {
log.Println(errors.New("joinチャンネルへのウェルカムメッセージ送信に失敗しました"))
}
}
func existSameRole(guild *discordgo.Guild, roleName string) bool {
roleID := getRoleID(guild, roleName)
return roleID != ""
}
func getRoleID(guild *discordgo.Guild, roleName string) (roleID string) {
for _, role := range guild.Roles {
// もしギルド内に既に同名のロールがある場合、ロールIDを返す
if role.Name == roleName {
return role.ID
}
}
// 同名のロールがない場合, 空文字列を返す
return ""
}
func welcomeMessageContent(targetMember, guestRoleName string) string {
return fmt.Sprintf("%v さん、HUITにようこそ!\n体験入部期間は %v までとなります。", targetMember, guestRoleName)
}