mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	This commit was originally automatically generated using `tools/lint --only=eslint --fix`. It was then modified by tabbott to contain only changes to a set of files that are unlikely to result in significant merge conflicts with any open pull request, excluding about 20 files. His plan is to merge the remaining changes with more precise care, potentially involving merging parts of conflicting pull requests before running the `eslint --fix` operation. Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
		
			
				
	
	
		
			151 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const render_widgets_tictactoe_widget = require('../templates/widgets/tictactoe_widget.hbs');
 | 
						|
 | 
						|
const tictactoe_data_holder = function () {
 | 
						|
    const self = {};
 | 
						|
 | 
						|
    const me = people.my_current_user_id();
 | 
						|
    const square_values = {};
 | 
						|
    let num_filled = 0;
 | 
						|
    let waiting = false;
 | 
						|
    let game_over = false;
 | 
						|
 | 
						|
    function is_game_over() {
 | 
						|
        const lines = [
 | 
						|
            [1, 2, 3],
 | 
						|
            [4, 5, 6],
 | 
						|
            [7, 8, 9],
 | 
						|
            [1, 4, 7],
 | 
						|
            [2, 5, 8],
 | 
						|
            [3, 6, 9],
 | 
						|
            [1, 5, 9],
 | 
						|
            [7, 5, 3],
 | 
						|
        ];
 | 
						|
 | 
						|
        function line_won(line) {
 | 
						|
            const token = square_values[line[0]];
 | 
						|
 | 
						|
            if (!token) {
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
 | 
						|
            return (
 | 
						|
                square_values[line[1]] === token &&
 | 
						|
                square_values[line[2]] === token);
 | 
						|
        }
 | 
						|
 | 
						|
        const board = [1, 2, 3, 4, 5, 6, 7, 8, 9];
 | 
						|
        function filled(i) {
 | 
						|
            return square_values[i];
 | 
						|
        }
 | 
						|
 | 
						|
        return _.any(lines, line_won) || _.all(board, filled);
 | 
						|
    }
 | 
						|
 | 
						|
    self.get_widget_data = function () {
 | 
						|
        function square(i) {
 | 
						|
            return {
 | 
						|
                val: square_values[i],
 | 
						|
                idx: i,
 | 
						|
                disabled: waiting || square_values[i] || game_over,
 | 
						|
            };
 | 
						|
        }
 | 
						|
 | 
						|
        const squares = [
 | 
						|
            [square(1), square(2), square(3)],
 | 
						|
            [square(4), square(5), square(6)],
 | 
						|
            [square(7), square(8), square(9)],
 | 
						|
        ];
 | 
						|
 | 
						|
        const token = num_filled % 2 === 0 ? 'X' : 'O';
 | 
						|
        let move_status = token + "'s turn";
 | 
						|
 | 
						|
        if (game_over) {
 | 
						|
            move_status = "Game over!";
 | 
						|
        }
 | 
						|
 | 
						|
        const widget_data = {
 | 
						|
            squares: squares,
 | 
						|
            move_status: move_status,
 | 
						|
        };
 | 
						|
 | 
						|
        return widget_data;
 | 
						|
    };
 | 
						|
 | 
						|
    self.handle = {
 | 
						|
        square_click: {
 | 
						|
            outbound: function (idx) {
 | 
						|
                const event = {
 | 
						|
                    type: 'square_click',
 | 
						|
                    idx: idx,
 | 
						|
                    num_filled: num_filled,
 | 
						|
                };
 | 
						|
                return event;
 | 
						|
            },
 | 
						|
 | 
						|
            inbound: function (sender_id, data) {
 | 
						|
                const idx = data.idx;
 | 
						|
 | 
						|
                if (data.num_filled !== num_filled) {
 | 
						|
                    blueslip.info('out of sync', data.num_filled);
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
 | 
						|
                const token = num_filled % 2 === 0 ? 'X' : 'O';
 | 
						|
 | 
						|
                if (square_values[idx]) {
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
 | 
						|
                waiting = sender_id === me;
 | 
						|
 | 
						|
                square_values[idx] = token;
 | 
						|
                num_filled += 1;
 | 
						|
 | 
						|
                game_over = is_game_over();
 | 
						|
            },
 | 
						|
        },
 | 
						|
    };
 | 
						|
 | 
						|
 | 
						|
    self.handle_event = function (sender_id, data) {
 | 
						|
        const type = data.type;
 | 
						|
        if (self.handle[type]) {
 | 
						|
            self.handle[type].inbound(sender_id, data);
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    return self;
 | 
						|
};
 | 
						|
 | 
						|
exports.activate = function (opts) {
 | 
						|
    const elem = opts.elem;
 | 
						|
    const callback = opts.callback;
 | 
						|
 | 
						|
    const tictactoe_data = tictactoe_data_holder();
 | 
						|
 | 
						|
    function render() {
 | 
						|
        const widget_data = tictactoe_data.get_widget_data();
 | 
						|
        const html = render_widgets_tictactoe_widget(widget_data);
 | 
						|
        elem.html(html);
 | 
						|
 | 
						|
        elem.find("button.tictactoe-square").on('click', function (e) {
 | 
						|
            e.stopPropagation();
 | 
						|
            const idx = $(e.target).attr('data-idx');
 | 
						|
 | 
						|
            const data = tictactoe_data.handle.square_click.outbound(idx);
 | 
						|
            callback(data);
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    elem.handle_events = function (events) {
 | 
						|
        _.each(events, function (event) {
 | 
						|
            tictactoe_data.handle_event(event.sender_id, event.data);
 | 
						|
        });
 | 
						|
        render();
 | 
						|
    };
 | 
						|
 | 
						|
    render();
 | 
						|
};
 | 
						|
 | 
						|
window.tictactoe_widget = exports;
 |