Mercurial > irccd
annotate plugins/roulette/roulette.js @ 722:3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 16 Jul 2018 21:19:47 +0200 |
parents | 27587ff92a64 |
children | 8c44bbcbbab9 |
rev | line source |
---|---|
0 | 1 /* |
2 * roulette.js -- russian roulette game | |
3 * | |
628
27587ff92a64
Misc: update copyrights
David Demelier <markand@malikania.fr>
parents:
436
diff
changeset
|
4 * Copyright (c) 2013-2018 David Demelier <markand@malikania.fr> |
0 | 5 * |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
146
175bc5d41cc4
Plugin roulette: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
48
diff
changeset
|
19 // Plugin information. |
0 | 20 info = { |
722
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
21 name: "roulette", |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
22 author: "David Demelier <markand@malikania.fr>", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
23 license: "ISC", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
24 summary: "A russian roulette for IRC", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
25 version: "@IRCCD_VERSION@" |
0 | 26 }; |
27 | |
158
52affa4ade71
Plugin roulette: style
David Demelier <markand@malikania.fr>
parents:
146
diff
changeset
|
28 // Modules. |
52affa4ade71
Plugin roulette: style
David Demelier <markand@malikania.fr>
parents:
146
diff
changeset
|
29 var Logger = Irccd.Logger; |
52affa4ade71
Plugin roulette: style
David Demelier <markand@malikania.fr>
parents:
146
diff
changeset
|
30 var Plugin = Irccd.Plugin; |
52affa4ade71
Plugin roulette: style
David Demelier <markand@malikania.fr>
parents:
146
diff
changeset
|
31 var Server = Irccd.Server; |
52affa4ade71
Plugin roulette: style
David Demelier <markand@malikania.fr>
parents:
146
diff
changeset
|
32 var Util = Irccd.Util; |
52affa4ade71
Plugin roulette: style
David Demelier <markand@malikania.fr>
parents:
146
diff
changeset
|
33 |
146
175bc5d41cc4
Plugin roulette: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
48
diff
changeset
|
34 /** |
175bc5d41cc4
Plugin roulette: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
48
diff
changeset
|
35 * Formats for writing. |
175bc5d41cc4
Plugin roulette: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
48
diff
changeset
|
36 */ |
175bc5d41cc4
Plugin roulette: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
48
diff
changeset
|
37 Plugin.format = { |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
38 "lucky": "#{nickname}, you're lucky this time", |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
39 "shot": "HEADSHOT" |
146
175bc5d41cc4
Plugin roulette: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
48
diff
changeset
|
40 }; |
175bc5d41cc4
Plugin roulette: use new format section, #410
David Demelier <markand@malikania.fr>
parents:
48
diff
changeset
|
41 |
0 | 42 function Gun(server, channel) |
43 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
44 this.server = server; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
45 this.channel = channel; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
46 this.index = 0; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
47 this.bullet = Math.floor(Math.random() * 6); |
0 | 48 } |
49 | |
50 /** | |
51 * Map of games. | |
52 */ | |
53 Gun.map = {}; | |
54 | |
55 /** | |
56 * Search for an existing game. | |
57 * | |
58 * @param server the server object | |
59 * @param channel the channel name | |
60 * @return the hangman instance or undefined if no one exists | |
61 */ | |
62 Gun.find = function (server, channel) | |
63 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
64 return Gun.map[server.toString() + '@' + channel]; |
0 | 65 } |
66 | |
67 /** | |
68 * Create a new game, store it in the map and return it. | |
69 * | |
70 * @param server the server object | |
71 * @param channel the channel name | |
72 * @return the hangman object | |
73 */ | |
74 Gun.create = function (server, channel) | |
75 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
76 return Gun.map[server.toString() + "@" + channel] = new Gun(server, channel); |
0 | 77 } |
78 | |
79 /** | |
80 * Remove the specified game from the map. | |
81 * | |
82 * @param game the game to remove | |
83 */ | |
84 Gun.remove = function (game) | |
85 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
86 delete Gun.map[game.server + "@" + game.channel]; |
0 | 87 } |
88 | |
89 /** | |
90 * Load all formats. | |
91 */ | |
92 Gun.loadFormats = function () | |
93 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
94 // --- DEPRECATED ------------------------------------------ |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
95 // |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
96 // This code will be removed. |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
97 // |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
98 // Since: 2.1.0 |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
99 // Until: 3.0.0 |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
100 // Reason: new [format] section replaces it. |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
101 // |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
102 // ---------------------------------------------------------- |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
103 for (var key in Plugin.format) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
104 var optname = "format-" + key; |
0 | 105 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
106 if (typeof (Plugin.config[optname]) !== "string") |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
107 continue; |
0 | 108 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
109 if (Plugin.config[optname].length === 0) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
110 Logger.warning("skipping empty '" + optname + "' format"); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
111 else |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
112 Plugin.format[key] = Plugin.config[optname]; |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
113 } |
0 | 114 } |
115 | |
116 Gun.prototype.shot = function () | |
117 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
118 return this.index++ === this.bullet; |
0 | 119 } |
120 | |
121 function onLoad() | |
122 { | |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
123 Gun.loadFormats(); |
0 | 124 } |
125 | |
126 onReload = onLoad; | |
127 | |
128 function onCommand(server, origin, channel) | |
129 { | |
436
a2ed6bc6e42c
Fix #642: fix case sensitivity in hangman, roulette
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
130 channel = channel.toLowerCase(); |
a2ed6bc6e42c
Fix #642: fix case sensitivity in hangman, roulette
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
131 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
132 var kw = { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
133 channel: channel, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
134 command: server.info().commandChar + Plugin.info().name, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
135 nickname: Util.splituser(origin), |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
136 origin: origin, |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
137 server: server.toString(), |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
138 plugin: Plugin.info().name |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
139 }; |
0 | 140 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
141 var game = Gun.find(server, channel); |
0 | 142 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
143 if (!game) |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
144 game = Gun.create(server, channel); |
0 | 145 |
207
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
146 if (game.shot()) { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
147 server.kick(Util.splituser(origin), channel, Util.format(Plugin.format["shot"], kw)); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
148 Gun.remove(game); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
149 } else { |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
150 kw.count = (6 - game.index).toString(); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
151 server.message(channel, Util.format(Plugin.format["lucky"], kw)); |
6635b9187d71
Irccd: switch to 4 spaces indent, #518
David Demelier <markand@malikania.fr>
parents:
158
diff
changeset
|
152 } |
0 | 153 } |