0
|
1 /* |
|
2 * roulette.js -- russian roulette game |
|
3 * |
|
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> |
|
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 |
|
19 var Logger = Irccd.Logger; |
|
20 var Plugin = Irccd.Plugin; |
|
21 var Server = Irccd.Server; |
|
22 var Util = Irccd.Util; |
|
23 |
|
24 /* Plugin information */ |
|
25 info = { |
|
26 author: "David Demelier <markand@malikania.fr>", |
|
27 license: "ISC", |
|
28 summary: "A russian roulette for IRC", |
|
29 version: "@IRCCD_VERSION@" |
|
30 }; |
|
31 |
|
32 function Gun(server, channel) |
|
33 { |
|
34 this.server = server; |
|
35 this.channel = channel; |
|
36 this.index = 0; |
|
37 this.bullet = Math.floor(Math.random() * 6); |
|
38 } |
|
39 |
|
40 /** |
|
41 * Map of games. |
|
42 */ |
|
43 Gun.map = {}; |
|
44 |
|
45 /** |
|
46 * Formats for writing. |
|
47 */ |
|
48 Gun.formats = { |
|
49 "lucky": "#{nickname}, you're lucky this time", |
|
50 "shot": "HEADSHOT" |
|
51 }; |
|
52 |
|
53 /** |
|
54 * Search for an existing game. |
|
55 * |
|
56 * @param server the server object |
|
57 * @param channel the channel name |
|
58 * @return the hangman instance or undefined if no one exists |
|
59 */ |
|
60 Gun.find = function (server, channel) |
|
61 { |
|
62 return Gun.map[server.toString() + '@' + channel]; |
|
63 } |
|
64 |
|
65 /** |
|
66 * Create a new game, store it in the map and return it. |
|
67 * |
|
68 * @param server the server object |
|
69 * @param channel the channel name |
|
70 * @return the hangman object |
|
71 */ |
|
72 Gun.create = function (server, channel) |
|
73 { |
|
74 return Gun.map[server.toString() + "@" + channel] = new Gun(server, channel); |
|
75 } |
|
76 |
|
77 /** |
|
78 * Remove the specified game from the map. |
|
79 * |
|
80 * @param game the game to remove |
|
81 */ |
|
82 Gun.remove = function (game) |
|
83 { |
|
84 delete Gun.map[game.server + "@" + game.channel]; |
|
85 } |
|
86 |
|
87 /** |
|
88 * Load all formats. |
|
89 */ |
|
90 Gun.loadFormats = function () |
|
91 { |
|
92 for (var key in Gun.formats) { |
|
93 var optname = "format-" + key; |
|
94 |
|
95 if (typeof (Plugin.config[optname]) !== "string") |
|
96 continue; |
|
97 |
|
98 if (Plugin.config[optname].length === 0) |
|
99 Logger.warning("skipping empty '" + optname + "' format"); |
|
100 else |
|
101 Gun.formats[key] = Plugin.config[optname]; |
|
102 } |
|
103 } |
|
104 |
|
105 Gun.prototype.shot = function () |
|
106 { |
|
107 return this.index++ === this.bullet; |
|
108 } |
|
109 |
|
110 function onLoad() |
|
111 { |
|
112 Gun.loadFormats(); |
|
113 } |
|
114 |
|
115 onReload = onLoad; |
|
116 |
|
117 function onCommand(server, origin, channel) |
|
118 { |
|
119 var kw = { |
|
120 channel: channel, |
|
121 command: server.info().commandChar + Plugin.info().name, |
|
122 nickname: Util.splituser(origin), |
|
123 origin: origin, |
|
124 server: server, |
|
125 plugin: Plugin.info().name |
|
126 }; |
|
127 |
|
128 var game = Gun.find(server, channel); |
|
129 |
|
130 if (!game) |
|
131 game = Gun.create(server, channel); |
|
132 |
|
133 if (game.shot()) { |
|
134 server.kick(Util.splituser(origin), channel, Util.format(Gun.formats["shot"], kw)); |
|
135 Gun.remove(game); |
|
136 } else { |
|
137 kw.count = game.index; |
|
138 server.message(channel, Util.format(Gun.formats["lucky"], kw)); |
|
139 } |
|
140 } |