-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
160 lines (146 loc) · 4.53 KB
/
index.js
File metadata and controls
160 lines (146 loc) · 4.53 KB
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
import { Game } from "@gathertown/gather-game-client";
import Slack from "@slack/bolt";
import dotenv from "dotenv";
import webSocket from "isomorphic-ws";
// gatherに常駐しているbotの名前
const GATHER_BOT_NAME = "slack_botくん";
const updateSlack = async (playersList, tsts) => {
const BLOCKS = generateBlocks(playersList, tsts);
console.log(BLOCKS);
try {
var result = await app.client.chat.update({
channel: process.env.SLACK_CHANNEL_ID,
ts: tsts,
blocks: BLOCKS,
});
console.log(result);
return result.ts;
} catch (error) {
console.error(error);
var result = await app.client.chat.update({
channel: process.env.SLACK_CHANNEL_ID,
ts: tsts,
text: "エラーで更新できませんでした><",
});
}
};
// 初回投稿用の関数
// 投稿した時のタイムスタンプを返す.awaitで呼び出す.
const firstPost = async () => {
try {
const result = await app.client.chat.postMessage({
channel: process.env.SLACK_CHANNEL_ID,
text: "そのうち更新されます……",
});
console.log(result);
return result.ts;
} catch (error) {
console.error(error);
return error;
}
};
// Slackを更新する時の本文を生成する
const generateBlocks = (playersList, timeStamp) => {
var blocks = [];
let dateTime = new Date(Date.now() + 32400000);
// gatherにいる人を追加していく
playersList.forEach((player) => {
console.log(player);
if (player && player.name != GATHER_BOT_NAME) {
var section = {
type: "section",
text: {
type: "mrkdwn",
text: `*${player.name}* ${player.emojiStatus ? " " + player.emojiStatus : ""}\n:speech_balloon: ${player.textStatus}`,
},
};
blocks.push(section);
}
});
blocks.push({
type: "actions",
elements: [
{
type: "button",
text: {
type: "plain_text",
text: "botを起こす",
},
value: "get_up",
action_id: "get_up",
},
],
});
blocks.push({
type: "context",
elements: [
{
type: "mrkdwn",
text: `Last Update: ${dateTime.toLocaleTimeString("ja-JP")} ${dateTime.toLocaleDateString()}`,
},
],
});
return blocks;
};
const onConnected = (connected) => {
console.log("Connected: ", connected);
game.enter(process.env.SPACE_ID);
console.log(Object.keys(game.players));
console.log(game.getStats());
};
const updateInfo = () => {
var gamePlayersList = Array();
setTimeout(async () => {
Object.keys(game.players).forEach((e) => {
// e: playerのID
gamePlayersList.push(game.getPlayer(e));
});
// websocketを使ってプレイヤーが入ってくるイベントを監視してる
process.env.TS = await updateSlack(gamePlayersList, process.env.TS);
}, 5000); // プレイヤーが入室してからgame.playersに反映されるのに少し時間がかかる
};
/* **********************
********* main **********
*********************** */
const { App } = Slack;
dotenv.config();
global.WebSocket = webSocket;
// Initializes your app with your bot token and signing secret
const app = new App({
token: process.env.SLACK_BOT_TOKEN,
signingSecret: process.env.SLACK_SIGNING_SECRET,
port: process.env.PORT || 3000,
processBeforeResponse: true,
});
(async () => {
// Start your app
await app.start(process.env.PORT || 3000);
console.log("⚡️ Bolt app is running!");
if (!process.env.TS) {
process.env.TS = await firstPost();
}
})();
// gatherのgameクラス初期化
const game = new Game(process.env.SPACE_ID, () => Promise.resolve({ apiKey: process.env.API_KEY }));
game.connect();
game.subscribeToConnection(onConnected);
// websocketを使ってプレイヤーが入ってくるイベントを監視してる
game.subscribeToEvent("playerJoins", (player) => {
console.log("playerJoined");
updateInfo();
});
// websocketを使ってプレイヤーが出ていくイベントを監視してる
game.subscribeToEvent("playerExits", (player) => {
console.log("playerExited");
updateInfo();
});
// websocketを使ってプレイヤーがテキストステータスを変えるイベントを監視してる
game.subscribeToEvent("playerSetsTextStatus", (player) => {
console.log("player sets text status");
updateInfo();
});
// websocketを使ってプレイヤーが絵文字ステータスを変えるイベントを監視してる
game.subscribeToEvent("playerSetsEmojiStatus", (player) => {
console.log("player sets emoji status");
updateInfo();
});