wip
This commit is contained in:
@@ -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;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
Reference in New Issue
Block a user