summaryrefslogtreecommitdiff
path: root/src/api/stream/othello-game.ts
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-03-07 17:48:32 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-03-07 17:48:32 +0900
commit161fd4afab323ca6bf491def473f84bb7557b481 (patch)
tree4c8a2215dc9d3e3b817bbd82ca9b8f88fb0a0420 /src/api/stream/othello-game.ts
parentwip (diff)
downloadsharkey-161fd4afab323ca6bf491def473f84bb7557b481.tar.gz
sharkey-161fd4afab323ca6bf491def473f84bb7557b481.tar.bz2
sharkey-161fd4afab323ca6bf491def473f84bb7557b481.zip
wip
Diffstat (limited to 'src/api/stream/othello-game.ts')
-rw-r--r--src/api/stream/othello-game.ts63
1 files changed, 60 insertions, 3 deletions
diff --git a/src/api/stream/othello-game.ts b/src/api/stream/othello-game.ts
index ab91ef6422..17cdd3a9e7 100644
--- a/src/api/stream/othello-game.ts
+++ b/src/api/stream/othello-game.ts
@@ -1,12 +1,69 @@
import * as websocket from 'websocket';
import * as redis from 'redis';
+import Game from '../models/othello-game';
+import { publishOthelloGameStream } from '../event';
+import Othello from '../../common/othello';
-export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient): void {
- const game = request.resourceURL.query.game;
+export default function(request: websocket.request, connection: websocket.connection, subscriber: redis.RedisClient, user: any): void {
+ const gameId = request.resourceURL.query.game;
// Subscribe game stream
- subscriber.subscribe(`misskey:othello-game-stream:${game}`);
+ subscriber.subscribe(`misskey:othello-game-stream:${gameId}`);
subscriber.on('message', (_, data) => {
connection.send(data);
});
+
+ connection.on('message', async (data) => {
+ const msg = JSON.parse(data.utf8Data);
+
+ switch (msg.type) {
+ case 'set':
+ if (msg.pos == null) return;
+ const pos = msg.pos;
+
+ const game = await Game.findOne({ _id: gameId });
+
+ const o = new Othello();
+
+ game.logs.forEach(log => {
+ o.set(log.color, log.pos);
+ });
+
+ const myColor = game.black_user_id.equals(user._id) ? 'black' : 'white';
+ const opColor = myColor == 'black' ? 'white' : 'black';
+
+ if (!o.canReverse(myColor, pos)) return;
+ o.set(myColor, pos);
+
+ let turn;
+ if (o.getPattern(opColor).length > 0) {
+ turn = myColor == 'black' ? game.white_user_id : game.black_user_id;
+ } else {
+ turn = myColor == 'black' ? game.black_user_id : game.white_user_id;
+ }
+
+ const log = {
+ at: new Date(),
+ color: myColor,
+ pos
+ };
+
+ await Game.update({
+ _id: gameId
+ }, {
+ $set: {
+ turn_user_id: turn
+ },
+ $push: {
+ logs: log
+ }
+ });
+
+ publishOthelloGameStream(gameId, 'set', {
+ color: myColor,
+ pos
+ });
+ break;
+ }
+ });
}