annotate plugins/roulette/roulette.js @ 75:f8160d515a76

Irccd: rework a lot the JavaScript library
author David Demelier <markand@malikania.fr>
date Wed, 30 Mar 2016 13:52:47 +0200
parents ce3e96deb9e4
children 175bc5d41cc4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * roulette.js -- russian roulette game
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 var Logger = Irccd.Logger;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 var Plugin = Irccd.Plugin;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 var Server = Irccd.Server;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 var Util = Irccd.Util;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 /* Plugin information */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 info = {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 author: "David Demelier <markand@malikania.fr>",
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 license: "ISC",
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 summary: "A russian roulette for IRC",
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 version: "@IRCCD_VERSION@"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 function Gun(server, channel)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 this.server = server;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 this.channel = channel;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 this.index = 0;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 this.bullet = Math.floor(Math.random() * 6);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 * Map of games.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 Gun.map = {};
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 * Formats for writing.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 Gun.formats = {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 "lucky": "#{nickname}, you're lucky this time",
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 "shot": "HEADSHOT"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 * Search for an existing game.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 * @param server the server object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 * @param channel the channel name
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 * @return the hangman instance or undefined if no one exists
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 Gun.find = function (server, channel)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 return Gun.map[server.toString() + '@' + channel];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 * Create a new game, store it in the map and return it.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 * @param server the server object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 * @param channel the channel name
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 * @return the hangman object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 Gun.create = function (server, channel)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 return Gun.map[server.toString() + "@" + channel] = new Gun(server, channel);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 * Remove the specified game from the map.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 * @param game the game to remove
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 Gun.remove = function (game)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 delete Gun.map[game.server + "@" + game.channel];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 * Load all formats.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 Gun.loadFormats = function ()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 for (var key in Gun.formats) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 var optname = "format-" + key;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 if (typeof (Plugin.config[optname]) !== "string")
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 continue;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 if (Plugin.config[optname].length === 0)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 Logger.warning("skipping empty '" + optname + "' format");
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 Gun.formats[key] = Plugin.config[optname];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 Gun.prototype.shot = function ()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 return this.index++ === this.bullet;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 function onLoad()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 Gun.loadFormats();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 onReload = onLoad;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 function onCommand(server, origin, channel)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 var kw = {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 channel: channel,
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 command: server.info().commandChar + Plugin.info().name,
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 nickname: Util.splituser(origin),
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 origin: origin,
48
ce3e96deb9e4 Plugin roulette: document missing keywords and fix count, #392
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
124 server: server.toString(),
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 plugin: Plugin.info().name
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 var game = Gun.find(server, channel);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 if (!game)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 game = Gun.create(server, channel);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 if (game.shot()) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 server.kick(Util.splituser(origin), channel, Util.format(Gun.formats["shot"], kw));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 Gun.remove(game);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 } else {
48
ce3e96deb9e4 Plugin roulette: document missing keywords and fix count, #392
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
137 kw.count = (6 - game.index).toString();
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 server.message(channel, Util.format(Gun.formats["lucky"], kw));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 }