This repository has been archived by the owner on Jan 12, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinit.go
166 lines (147 loc) · 4.98 KB
/
init.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/bwmarrin/discordgo"
"gopkg.in/yaml.v2"
)
var (
// config.yaml, token.yaml で設定した情報
configData configYaml
tokenData tokenYaml
// 各トークンの残りのGETリクエスト可能回数を記録
tokenLimit map[string]int = make(map[string]int, 0)
// 全ての課題情報
homeworksData ResponseJSON
homeworksDataOnlyFuture ResponseJSON
homeworksDataJST ResponseJSON
homeworksDataOnlyFutureJST ResponseJSON
// Discordボットのセッション
dg *discordgo.Session
// アラームを送信したかどうか
errorAlarmed bool = false
)
// ResponseJSON は返すJSONの元の構造体
type ResponseJSON struct {
Acquisition time.Time `json:"acquisition"`
Homeworks []HomeworkStruct `json:"homeworks"`
}
// HomeworkStruct は1つの課題情報を収納する構造体
type HomeworkStruct struct {
Subject string `json:"subject"`
Omitted string `json:"omitted"`
Name string `json:"name"`
ID string `json:"id"`
Due time.Time `json:"due"`
}
// config.yaml のデータを格納する構造体
type configYaml struct {
UpdateTimes []int `yaml:"update-times"`
Port int `yaml:"server-port"`
FCGI bool `yaml:"fcgi-server"`
GETLimit int `yaml:"get-limit"`
Subjects configYamlSubjects `yaml:"subjects"`
Discord configYamlDiscord `yaml:"discord"`
}
type configYamlSubjects struct {
Teams []string `yaml:"teams"`
Syllabus []string `yaml:"syllabus"`
Omitted []string `yaml:"omitted"`
}
type configYamlDiscord struct {
Alarm bool `yaml:"alarm"`
AdminID string `yaml:"admin-id"`
MessageFormat string `yaml:"message-format"`
CommandPrefix string `yaml:"command-prefix"`
}
// token.yaml のデータを格納する構造体
type tokenYaml struct {
AllowedTokens []string `yaml:"allowed-tokens"`
DiscordToken string `yaml:"discord-token"`
}
func init() {
var fileData []byte
var err error
// config.yaml を読み込む
if !isFileExist("config.yaml") {
log.Println("エラー: config.yaml が見つかりません")
log.Println("APIの基本的な設定を書くファイルですので、ファイルが存在しないと起動できません。")
panic("起動に失敗しました。")
}
fileData, err = ioutil.ReadFile("config.yaml")
if err != nil {
panic(err)
}
// config.yaml からデータを取得
err = yaml.Unmarshal(fileData, &configData)
if err != nil {
panic(err)
}
// token.yaml を読み込む
if !isFileExist("token.yaml") {
log.Println("エラー: token.yaml が見つかりません")
log.Println("APIを利用されるのに必要なトークンを書くファイルですので、ファイルが存在しないと起動できません。")
panic("起動に失敗しました。")
}
fileData, err = ioutil.ReadFile("token.yaml")
if err != nil {
panic(err)
}
// token.yaml からデータを取得
err = yaml.Unmarshal(fileData, &tokenData)
if err != nil {
panic(err)
}
// Discordを起動する設定になっていれば
if configData.Discord.Alarm {
if tokenData.DiscordToken == "" {
log.Println("エラー: Discordボットのトークンが設定されていません。")
log.Println("Discord報告機能をオンにするには、報告するボットのトークンが必要です。")
panic("起動に失敗しました。")
}
if configData.Discord.AdminID == "" {
log.Println("エラー: Discordボットに報告してもらうユーザーのIDが設定されていません。")
log.Println("Discord報告機能をオンにするには、報告してもらうユーザーのIDが必要です。")
log.Println("もしユーザーIDを確認できない場合は、Discordの設定の「テーマ」の「詳細設定」からユーザーIDを確認できる設定にできます。")
panic("起動に失敗しました。")
}
// Discordボットを起動
go discordInit()
}
}
// discordInit はDiscordボットを準備するための関数
func discordInit() {
var err error
dg, err = discordgo.New("Bot " + tokenData.DiscordToken)
if err != nil {
log.Println("エラー: Discordボットの起動に失敗しました。")
log.Println(err)
panic("起動に失敗しました。")
}
dg.AddHandler(messageCreate)
err = dg.Open()
if err != nil {
log.Println("エラー: Discordボットの起動に失敗しました。")
log.Println(err)
panic("起動に失敗しました。")
}
fmt.Println("Discordボットを起動しました。")
// Discordボットを稼働
sc := make(chan os.Signal, 1)
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)
<-sc
defer dg.Close()
}
// isFileExist は特定のファイルが見つかればtrueを返す関数
func isFileExist(fileName string) bool {
// ファイル情報を取得できなかったら
if _, err := os.Stat(fileName); os.IsNotExist(err) {
return false
}
return true
}