corrade-lsl-templates – Blame information for rev 29

Subversion Repositories:
Rev:
Rev Author Line No. Line
15 office 1 ///////////////////////////////////////////////////////////////////////////
29 office 2 // Copyright (C) Wizardry and Steamworks 2016 - License: CC BY 2.0 //
15 office 3 ///////////////////////////////////////////////////////////////////////////
4 //
5 // A module that bans group members using fuzzy name matching.
6 //
7 ///////////////////////////////////////////////////////////////////////////
8  
9 ///////////////////////////////////////////////////////////////////////////
29 office 10 // Copyright (C) 2014 Wizardry and Steamworks - License: CC BY 2.0 //
15 office 11 ///////////////////////////////////////////////////////////////////////////
12 string wasKeyValueGet(string k, string data) {
13 if(llStringLength(data) == 0) return "";
14 if(llStringLength(k) == 0) return "";
15 list a = llParseString2List(data, ["&", "="], []);
16 integer i = llListFindList(a, [ k ]);
17 if(i != -1) return llList2String(a, i+1);
18 return "";
19 }
20  
21 ///////////////////////////////////////////////////////////////////////////
29 office 22 // Copyright (C) 2013 Wizardry and Steamworks - License: CC BY 2.0 //
15 office 23 ///////////////////////////////////////////////////////////////////////////
24 string wasKeyValueEncode(list data) {
25 list k = llList2ListStrided(data, 0, -1, 2);
26 list v = llList2ListStrided(llDeleteSubList(data, 0, 0), 0, -1, 2);
27 data = [];
28 do {
29 data += llList2String(k, 0) + "=" + llList2String(v, 0);
30 k = llDeleteSubList(k, 0, 0);
31 v = llDeleteSubList(v, 0, 0);
32 } while(llGetListLength(k) != 0);
33 return llDumpList2String(data, "&");
34 }
35  
36 ///////////////////////////////////////////////////////////////////////////
29 office 37 // Copyright (C) 2011 Wizardry and Steamworks - License: CC BY 2.0 //
15 office 38 ///////////////////////////////////////////////////////////////////////////
39 // http://was.fm/secondlife/wanderer
40 vector wasCirclePoint(float radius) {
41 float x = llPow(-1, 1 + (integer) llFrand(2)) * llFrand(radius*2);
42 float y = llPow(-1, 1 + (integer) llFrand(2)) * llFrand(radius*2);
43 if(llPow(x,2) + llPow(y,2) <= llPow(radius,2))
44 return <x, y, 0>;
45 return wasCirclePoint(radius);
46 }
47  
48 ///////////////////////////////////////////////////////////////////////////
29 office 49 // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 //
15 office 50 ///////////////////////////////////////////////////////////////////////////
51 // escapes a string in conformance with RFC1738
52 string wasURLEscape(string i) {
53 string o = "";
54 do {
55 string c = llGetSubString(i, 0, 0);
56 i = llDeleteSubString(i, 0, 0);
57 if(c == "") jump continue;
58 if(c == " ") {
59 o += "+";
60 jump continue;
61 }
62 if(c == "\n") {
63 o += "%0D" + llEscapeURL(c);
64 jump continue;
65 }
66 o += llEscapeURL(c);
67 @continue;
68 } while(i != "");
69 return o;
70 }
71  
72 ///////////////////////////////////////////////////////////////////////////
29 office 73 // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 //
15 office 74 ///////////////////////////////////////////////////////////////////////////
75 list wasCSVToList(string csv) {
76 list l = [];
77 list s = [];
78 string m = "";
79 do {
80 string a = llGetSubString(csv, 0, 0);
81 csv = llDeleteSubString(csv, 0, 0);
82 if(a == ",") {
83 if(llList2String(s, -1) != "\"") {
84 l += m;
85 m = "";
86 jump continue;
87 }
88 m += a;
89 jump continue;
90 }
91 if(a == "\"" && llGetSubString(csv, 0, 0) == a) {
92 m += a;
93 csv = llDeleteSubString(csv, 0, 0);
94 jump continue;
95 }
96 if(a == "\"") {
97 if(llList2String(s, -1) != a) {
98 s += a;
99 jump continue;
100 }
101 s = llDeleteSubList(s, -1, -1);
102 jump continue;
103 }
104 m += a;
105 @continue;
106 } while(csv != "");
107 // postcondition: length(s) = 0
108 return l + m;
109 }
110  
111 ///////////////////////////////////////////////////////////////////////////
29 office 112 // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 //
15 office 113 ///////////////////////////////////////////////////////////////////////////
114 string wasListToCSV(list l) {
115 list v = [];
116 do {
117 string a = llDumpList2String(
118 llParseStringKeepNulls(
119 llList2String(
120 l,
121  
122 ),
123 ["\""],
124 []
125 ),
126 "\"\""
127 );
128 if(llParseStringKeepNulls(
129 a,
130 [" ", ",", "\n", "\""], []
131 ) !=
132 (list) a
133 ) a = "\"" + a + "\"";
134 v += a;
135 l = llDeleteSubList(l, 0, 0);
136 } while(l != []);
137 return llDumpList2String(v, ",");
138 }
139  
140 ///////////////////////////////////////////////////////////////////////////
29 office 141 // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 //
15 office 142 ///////////////////////////////////////////////////////////////////////////
143 // unescapes a string in conformance with RFC1738
144 string wasURLUnescape(string i) {
145 return llUnescapeURL(
146 llDumpList2String(
147 llParseString2List(
148 llDumpList2String(
149 llParseString2List(
150 i,
151 ["+"],
152 []
153 ),
154 " "
155 ),
156 ["%0D%0A"],
157 []
158 ),
159 "\n"
160 )
161 );
162 }
163  
164 ///////////////////////////////////////////////////////////////////////////
29 office 165 // Copyright (C) 2017 Wizardry and Steamworks - License: CC BY 2.0 //
15 office 166 ///////////////////////////////////////////////////////////////////////////
167 list wasSetIntersect(list a, list b) {
168 if(llGetListLength(a) == 0) return [];
169 string i = llList2String(a, 0);
170 a = llDeleteSubList(a, 0, 0);
171 if(llListFindList(b, (list)i) == -1)
172 return wasSetIntersect(a, b);
173 return i + wasSetIntersect(a, b);
174 }
175  
176 // configuration data
177 string configuration = "";
178 // callback URL
179 string URL = "";
180 // store message over state.
181 string data = "";
182 // banee
183 string firstname = "";
184 string lastname = "";
185 integer bantime = 4320;
186  
187 default {
188 state_entry() {
189 llOwnerSay("[Softban] Starting...");
190 llSetTimerEvent(10);
191 }
192 link_message(integer sender, integer num, string message, key id) {
193 if(id != "configuration") return;
194 llOwnerSay("[Softban] Got configuration...");
195 configuration = message;
196 state listen_group;
197 }
198 timer() {
199 llOwnerSay("[Softban] Requesting configuration...");
200 llMessageLinked(LINK_THIS, 0, "configuration", NULL_KEY);
201 }
202 on_rez(integer num) {
203 llResetScript();
204 }
205 changed(integer change) {
206 if((change & CHANGED_INVENTORY) ||
207 (change & CHANGED_REGION_START) ||
208 (change & CHANGED_OWNER)) {
209 llResetScript();
210 }
211 }
212 state_exit() {
213 llSetTimerEvent(0);
214 }
215 }
216  
217 state listen_group {
218 state_entry() {
219 // DEBUG
220 llOwnerSay("[Softban] Waiting for group messages...");
221 }
222 link_message(integer sender, integer num, string message, key id) {
223 // We only care about notifications now.
224 if(id != "notification")
225 return;
226  
227 // This script only processes group notifications.
228 if(wasKeyValueGet("type", message) != "group")
229 return;
230  
231 // Get the sent message.
232 data = wasURLUnescape(
233 wasKeyValueGet(
234 "message",
235 message
236 )
237 );
238  
239 // Check if this is an eggdrop command.
240 if(llGetSubString(data, 0, 0) !=
241 wasKeyValueGet("command", configuration))
242 return;
243  
244 // Check if the command matches the current module.
245 list command = llParseString2List(data, [" "], []);
246 if(llList2String(command, 0) !=
247 wasKeyValueGet("command", configuration) + "softban")
248 return;
249  
250 // Remove command.
251 command = llDeleteSubList(command, 0, 0);
252  
253 firstname = wasKeyValueGet("firstname", message);
254 lastname = wasKeyValueGet("lastname", message);
255  
256 if(firstname == "" || lastname == "") {
257 data = "And who would yarr be?";
258 state tell;
259 }
260  
261 // Dump the rest of the message.
262 data = llDumpList2String(command, " ");
263  
264 // Get an URL.
265 state url;
266 }
267 on_rez(integer num) {
268 llResetScript();
269 }
270 changed(integer change) {
271 if((change & CHANGED_INVENTORY) ||
272 (change & CHANGED_REGION_START) ||
273 (change & CHANGED_OWNER)) {
274 llResetScript();
275 }
276 }
277 }
278  
279 state url {
280 state_entry() {
281 // DEBUG
282 llOwnerSay("[Softban] Requesting URL...");
283 llRequestURL();
284 }
285 http_request(key id, string method, string body) {
286 if(method != URL_REQUEST_GRANTED) return;
287 URL = body;
288 // DEBUG
289 llOwnerSay("[Softban] Got URL...");
290 state get_caller_roles;
291 }
292 on_rez(integer num) {
293 llResetScript();
294 }
295 changed(integer change) {
296 if((change & CHANGED_INVENTORY) ||
297 (change & CHANGED_REGION_START) ||
298 (change & CHANGED_OWNER)) {
299 llResetScript();
300 }
301 }
302 }
303  
304 state get_caller_roles {
305 state_entry() {
306 // DEBUG
307 llOwnerSay("[Softban] Searching for caller...");
308 llInstantMessage(
309 wasKeyValueGet(
310 "corrade",
311 configuration
312 ),
313 wasKeyValueEncode(
314 [
315 "command", "getmemberroles",
316 "group", wasURLEscape(
317 wasKeyValueGet(
318 "group",
319 configuration
320 )
321 ),
322 "password", wasURLEscape(
323 wasKeyValueGet(
324 "password",
325 configuration
326 )
327 ),
328 "firstname", firstname,
329 "lastname", lastname,
330 "callback", wasURLEscape(URL)
331 ]
332 )
333 );
334 llSetTimerEvent(60);
335 }
336 http_request(key id, string method, string body) {
337 llHTTPResponse(id, 200, "OK");
338 if(wasKeyValueGet("command", body) != "getmemberroles" ||
339 wasKeyValueGet("success", body) != "True") {
340 // DEBUG
341 llOwnerSay("[Softban] Unable to get member roles: " +
342 wasURLUnescape(
343 wasKeyValueGet("error", body)
344 )
345 );
346 llReleaseURL(URL);
347 state listen_group;
348 }
349  
350 // Dump the roles to a list.
351 list roles = wasCSVToList(
352 wasURLUnescape(
353 wasKeyValueGet("data", body)
354 )
355 );
356  
357 if(llGetListLength(
358 wasSetIntersect(roles,
359 wasCSVToList(
360 wasKeyValueGet(
361 "admin roles", configuration
362 )
363 )
364 )
365 ) == 0) {
366 data = "You ain't got the cojones!";
367 llReleaseURL(URL);
368 state tell;
369 }
370  
371 list banee = llParseString2List(data, [" "], []);
372  
373 firstname = llList2String(banee, 0);
374 banee = llDeleteSubList(banee, 0, 0);
375 lastname = llList2String(banee, 0);
376 banee = llDeleteSubList(banee, 0, 0);
377  
378 if(firstname == "" || lastname == "") {
379 data = "Full name required.";
380 state tell;
381 }
382  
383 if(llGetListLength(banee) != 0 && llList2Integer(banee, 0) != 0) {
384 bantime = llList2Integer(banee, 0);
385 banee = llDeleteSubList(banee, 0, 0);
386 }
387  
388 // GC
389 banee = [];
390 state get_banee_roles;
391 }
392 timer() {
393 llReleaseURL(URL);
394 state listen_group;
395 }
396 on_rez(integer num) {
397 llResetScript();
398 }
399 changed(integer change) {
400 if((change & CHANGED_INVENTORY) ||
401 (change & CHANGED_REGION_START) ||
402 (change & CHANGED_OWNER)) {
403 llResetScript();
404 }
405 }
406 state_exit() {
407 llSetTimerEvent(0);
408 }
409 }
410  
411 state get_banee_roles {
412 state_entry() {
413 // DEBUG
414 llOwnerSay("[Softban] Searching for banee...");
415 llInstantMessage(
416 wasKeyValueGet(
417 "corrade",
418 configuration
419 ),
420 wasKeyValueEncode(
421 [
422 "command", "getmemberroles",
423 "group", wasURLEscape(
424 wasKeyValueGet(
425 "group",
426 configuration
427 )
428 ),
429 "password", wasURLEscape(
430 wasKeyValueGet(
431 "password",
432 configuration
433 )
434 ),
435 "firstname", firstname,
436 "lastname", lastname,
437 "callback", wasURLEscape(URL)
438 ]
439 )
440 );
441 llSetTimerEvent(60);
442 }
443 http_request(key id, string method, string body) {
444 llHTTPResponse(id, 200, "OK");
445 if(wasKeyValueGet("command", body) != "getmemberroles" ||
446 wasKeyValueGet("success", body) != "True") {
447 if(wasKeyValueGet("status", body) == "19862") {
448 // DEBUG
449 llOwnerSay("[Softban] User not in group, but proceeding anyway...");
450 jump continue;
451 }
452 // DEBUG
453 llOwnerSay("[Softban] Unable to get member roles: " +
454 wasURLUnescape(
455 wasKeyValueGet("error", body)
456 )
457 );
458 llReleaseURL(URL);
459 state listen_group;
460 }
461  
462 @continue;
463 string result = wasURLUnescape(
464 wasKeyValueGet("data", body)
465 );
466  
467 if(result != "" && llListFindList(wasCSVToList(result), (list)"Owners") != -1) {
468 data = "Ejectee is an owner. I'm not gunna open the pod bay doors.";
469 llReleaseURL(URL);
470 state tell;
471 }
472  
473 state ban;
474 }
475 timer() {
476 llReleaseURL(URL);
477 state listen_group;
478 }
479 on_rez(integer num) {
480 llResetScript();
481 }
482 changed(integer change) {
483 if((change & CHANGED_INVENTORY) ||
484 (change & CHANGED_REGION_START) ||
485 (change & CHANGED_OWNER)) {
486 llResetScript();
487 }
488 }
489 state_exit() {
490 llSetTimerEvent(0);
491 }
492 }
493  
494 state ban {
495 state_entry() {
496 // DEBUG
497 llOwnerSay("[Softban] Banning...");
498 llInstantMessage(
499 wasKeyValueGet(
500 "corrade",
501 configuration
502 ),
503 wasKeyValueEncode(
504 [
505 "command", "softban",
506 "group", wasURLEscape(
507 wasKeyValueGet(
508 "group",
509 configuration
510 )
511 ),
512 "password", wasURLEscape(
513 wasKeyValueGet(
514 "password",
515 configuration
516 )
517 ),
518 "action", "ban",
519 "avatars", wasURLEscape(
520 wasListToCSV(
521 [
522 firstname + " " + lastname
523 ]
524 )
525 ),
526 "time", wasURLEscape(
527 wasListToCSV(
528 [
529 bantime
530 ]
531 )
532 ),
533 "callback", wasURLEscape(URL)
534 ]
535 )
536 );
537 llSetTimerEvent(60);
538 }
539 http_request(key id, string method, string body) {
540 llHTTPResponse(id, 200, "OK");
541 llReleaseURL(URL);
542 if(wasKeyValueGet("command", body) != "softban" ||
543 wasKeyValueGet("success", body) != "True") {
544 // DEBUG
545 llOwnerSay("[Softban] Unable to soft ban member: " +
546 wasURLUnescape(
547 wasKeyValueGet("error", body)
548 )
549 );
550 state listen_group;
551 }
552  
553 data = "Hasta la vista, baby!";
554  
555 state tell;
556 }
557 timer() {
558 llReleaseURL(URL);
559 state listen_group;
560 }
561 on_rez(integer num) {
562 llResetScript();
563 }
564 changed(integer change) {
565 if((change & CHANGED_INVENTORY) ||
566 (change & CHANGED_REGION_START) ||
567 (change & CHANGED_OWNER)) {
568 llResetScript();
569 }
570 }
571 state_exit() {
572 llSetTimerEvent(0);
573 }
574 }
575  
576 state tell {
577 state_entry() {
578 // DEBUG
579 llOwnerSay("[Softban] Sending to group.");
580 llInstantMessage(
581 wasKeyValueGet(
582 "corrade",
583 configuration
584 ),
585 wasKeyValueEncode(
586 [
587 "command", "tell",
588 "group", wasURLEscape(
589 wasKeyValueGet(
590 "group",
591 configuration
592 )
593 ),
594 "password", wasURLEscape(
595 wasKeyValueGet(
596 "password",
597 configuration
598 )
599 ),
600 "entity", "group",
601 "message", wasURLEscape(data)
602 ]
603 )
604 );
605  
606 // reset variables.
607 bantime = 4320;
608  
609 state listen_group;
610 }
611 }