annotate plugins/hangman/hangman.js @ 402:2a11d0e07a53

Irccd: fix possible race in timer destruction/signal
author David Demelier <markand@malikania.fr>
date Wed, 11 Jan 2017 14:15:28 +0100
parents c6fbb6e0e06d
children a2ed6bc6e42c 722f2bbd654a
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 * hangman.js -- hangman game for IRC
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
394
c6fbb6e0e06d Happy new year!
David Demelier <markand@malikania.fr>
parents: 272
diff changeset
4 * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr>
0
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
154
f554d1314208 Plugin hangman: fix formats and invalid number of tries
David Demelier <markand@malikania.fr>
parents: 141
diff changeset
19 // Plugin information.
f554d1314208 Plugin hangman: fix formats and invalid number of tries
David Demelier <markand@malikania.fr>
parents: 141
diff changeset
20 info = {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
21 author: "David Demelier <markand@malikania.fr>",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
22 license: "ISC",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
23 summary: "A hangman game for IRC",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
24 version: "@IRCCD_VERSION@"
154
f554d1314208 Plugin hangman: fix formats and invalid number of tries
David Demelier <markand@malikania.fr>
parents: 141
diff changeset
25 };
f554d1314208 Plugin hangman: fix formats and invalid number of tries
David Demelier <markand@malikania.fr>
parents: 141
diff changeset
26
141
2ce88e3a4759 Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
27 // Modules.
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 var Logger = Irccd.Logger;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 var File = Irccd.File;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 var Plugin = Irccd.Plugin;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 var Server = Irccd.Server;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 var Unicode = Irccd.Unicode
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 var Util = Irccd.Util;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
141
2ce88e3a4759 Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
35 // Default options.
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 Plugin.config["collaborative"] = "true";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
141
2ce88e3a4759 Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
38 // Formats.
2ce88e3a4759 Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
39 Plugin.format = {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
40 "asked": "#{nickname}, '#{letter}' was already asked.",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
41 "dead": "#{nickname}, fail the word was: #{word}.",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
42 "found": "#{nickname}, nice! the word is now #{word}",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
43 "running": "#{nickname}, the game is already running.",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
44 "start": "#{nickname}, the game is started, the word to find is: #{word}",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
45 "win": "#{nickname}, congratulations, the word is #{word}.",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
46 "wrong-word": "#{nickname}, this is not the word.",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
47 "wrong-player": "#{nickname}, please wait until someone else proposes.",
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
48 "wrong-letter": "#{nickname}, there is no '#{letter}'."
141
2ce88e3a4759 Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
49 };
2ce88e3a4759 Plugin hangman: use new format section, #410
David Demelier <markand@malikania.fr>
parents: 44
diff changeset
50
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 function Hangman(server, channel)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
53 this.server = server;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
54 this.channel = channel;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
55 this.tries = 10;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
56 this.select();
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 * Map of games.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 Hangman.map = {};
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 * List of words
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 Hangman.words = [];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 * Search for an existing game.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 * @param server the server object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 * @param channel the channel name
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 * @return the hangman instance or undefined if no one exists
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 Hangman.find = function (server, channel)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
78 return Hangman.map[server.toString() + '@' + channel];
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 * Create a new game, store it in the map and return it.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 * @param server the server object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 * @param channel the channel name
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 * @return the hangman object
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 Hangman.create = function (server, channel)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
90 return Hangman.map[server.toString() + "@" + channel] = new Hangman(server, channel);
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * Remove the specified game from the map.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 * @param game the game to remove
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 Hangman.remove = function (game)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
100 delete Hangman.map[game.server + "@" + game.channel];
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 }
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 * Check if the text is a valid word.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 * @param word the word to check
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 * @return true if a word
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 Hangman.isWord = function (word)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
111 if (word.length === 0)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
112 return false;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
114 for (var i = 0; i < word.length; ++i)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
115 if (!Unicode.isLetter(word.charCodeAt(i)))
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
116 return false;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
118 return true;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 * Load all words.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 Hangman.loadWords = function ()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
126 var path;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
128 // User specified file?
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
129 if (Plugin.config["file"])
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
130 path = Plugin.config["file"];
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
131 else
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
132 path = Plugin.configPath + "words.conf";
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
134 try {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
135 Logger.info("loading words...");
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
137 var file = new File(path, "r");
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
138 var line;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
140 while ((line = file.readline()) !== undefined)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
141 if (Hangman.isWord(line))
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
142 Hangman.words.push(line);
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
143 } catch (e) {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
144 throw new Error("could not open '" + path + "'");
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
145 }
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
147 if (Hangman.words.length === 0)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
148 throw new Error("empty word database");
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
150 Logger.info("number of words in database: " + Hangman.words.length);
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 * Load all formats.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 Hangman.loadFormats = function ()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
158 // --- DEPRECATED -------------------------------------------
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
159 //
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
160 // This code will be removed.
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
161 //
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
162 // Since: 2.1.0
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
163 // Until: 3.0.0
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
164 // Reason: new [format] section replaces it.
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
165 //
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
166 // ----------------------------------------------------------
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
167 for (var key in Plugin.format) {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
168 var optname = "format-" + key;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
170 if (typeof (Plugin.config[optname]) !== "string")
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
171 continue;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
172
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
173 if (Plugin.config[optname].length === 0)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
174 Logger.warning("skipping empty '" + optname + "' format");
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
175 else
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
176 Plugin.format[key] = Plugin.config[optname];
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
177 }
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
179
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 * Select the next word for the game.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 Hangman.prototype.select = function ()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
185 // Reload the words if empty.
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
186 if (!this.words || this.words.length === 0)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
187 this.words = Hangman.words.slice(0);
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
189 var i = Math.floor(Math.random() * this.words.length);
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
191 this.word = this.words[i];
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
192 this.words.splice(i, 1);
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
193
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
194 // Fill table.
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
195 this.table = {};
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
197 for (var j = 0; j < this.word.length; ++j)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
198 this.table[this.word.charCodeAt(j)] = false;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 * Format the word with underscore and letters.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 * @return the secret
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 Hangman.prototype.formatWord = function ()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
208 var str = "";
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
209
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
210 for (var i = 0; i < this.word.length; ++i) {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
211 var ch = this.word.charCodeAt(i);
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
212
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
213 if (!this.table[ch])
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
214 str += "_";
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
215 else
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
216 str += String.fromCharCode(ch);
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
218 if (i + 1 < this.word.length)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
219 str += " ";
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
220 }
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
221
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
222 return str;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 /**
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 * Propose a word or a letter.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 * @param ch the code point or the unique word
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 * @param nickname the user trying
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 * @return the status of the game
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 Hangman.prototype.propose = function (ch, nickname)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
234 var status = "found";
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
235
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
236 // Check for collaborative mode.
272
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
237 if (Plugin.config["collaborative"] === "true" && !this.query) {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
238 if (this.last !== undefined && this.last === nickname)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
239 return "wrong-player";
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
240
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
241 this.last = nickname;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
242 }
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
243
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
244 if (typeof(ch) == "number") {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
245 if (this.table[ch] === undefined) {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
246 this.tries -= 1;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
247 status = "wrong-letter";
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
248 } else {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
249 if (this.table[ch]) {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
250 this.tries -= 1;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
251 status = "asked";
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
252 } else
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
253 this.table[ch] = true;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
254 }
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
255 } else {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
256 if (this.word != ch) {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
257 this.tries -= 1;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
258 status = "wrong-word";
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
259 } else
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
260 status = "win";
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
261 }
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
262
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
263 // Check if dead.
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
264 if (this.tries <= 0)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
265 status = "dead";
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
266
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
267 // Check if win.
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
268 var win = true;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
269
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
270 for (var i = 0; i < this.word.length; ++i) {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
271 if (!this.table[this.word.charCodeAt(i)]) {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
272 win = false;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
273 break;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
274 }
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
275 }
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
276
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
277 if (win)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
278 status = "win";
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
279
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
280 return status;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
282
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 function onLoad()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
285 Hangman.loadFormats();
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
286 Hangman.loadWords();
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
288
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 onReload = onLoad;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
290
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 function propose(server, channel, origin, game, proposition)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
293 var kw = {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
294 channel: channel,
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
295 command: server.info().commandChar + Plugin.info().name,
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
296 nickname: Util.splituser(origin),
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
297 origin: origin,
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
298 plugin: Plugin.info().name,
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
299 server: server.toString()
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
300 };
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
301
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
302 var st = game.propose(proposition, kw.nickname);
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
303
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
304 switch (st) {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
305 case "found":
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
306 kw.word = game.formatWord();
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
307 server.message(channel, Util.format(Plugin.format["found"], kw));
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
308 break;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
309 case "wrong-letter":
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
310 case "wrong-player":
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
311 case "wrong-word":
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
312 kw.word = proposition;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
313 case "asked":
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
314 kw.letter = String.fromCharCode(proposition);
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
315 server.message(channel, Util.format(Plugin.format[st], kw));
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
316 break;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
317 case "dead":
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
318 case "win":
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
319 kw.word = game.word;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
320 server.message(channel, Util.format(Plugin.format[st], kw));
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
321
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
322 // Remove the game.
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
323 Hangman.remove(game);
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
324 break;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
325 default:
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
326 break;
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
327 }
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
329
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 function onCommand(server, origin, channel, message)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
332 var game = Hangman.find(server, channel);
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
333 var kw = {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
334 channel: channel,
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
335 command: server.info().commandChar + Plugin.info().name,
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
336 nickname: Util.splituser(origin),
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
337 origin: origin,
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
338 plugin: Plugin.info().name,
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
339 server: server.toString()
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
340 };
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
341
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
342 if (game) {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
343 var list = message.split(" \t");
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
344
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
345 if (list.length === 0 || String(list[0]).length === 0)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
346 server.message(channel, Util.format(Plugin.format["running"], kw));
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
347 else {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
348 var word = String(list[0]);
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
349
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
350 if (Hangman.isWord(word))
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
351 propose(server, channel, origin, game, word);
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
352 }
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
353 } else {
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
354 game = Hangman.create(server, channel);
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
355 kw.word = game.formatWord();
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
356 server.message(channel, Util.format(Plugin.format["start"], kw));
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
357 }
272
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
358
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
359 return game;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
361
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 function onMessage(server, origin, channel, message)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 {
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
364 var game = Hangman.find(server, channel);
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
365
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
366 if (!game)
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
367 return;
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
368
207
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
369 if (message.length === 1 && Unicode.isLetter(message.charCodeAt(0)))
6635b9187d71 Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
370 propose(server, channel, origin, game, message.charCodeAt(0));
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 }
272
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
372
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
373 function onQueryCommand(server, origin, message)
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
374 {
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
375 onCommand(server, origin, Util.splituser(origin), message).query = true;
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
376 }
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
377
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
378 function onQuery(server, origin, message)
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
379 {
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
380 onMessage(server, origin, Util.splituser(origin), message);
8fb6bd57878c Plugin hangman: allow usage in query, closes #424
David Demelier <markand@malikania.fr>
parents: 207
diff changeset
381 }