corrade-lsl-templates – Blame information for rev 24

Subversion Repositories:
Rev:
Rev Author Line No. Line
11 office 1 ///////////////////////////////////////////////////////////////////////////
2 // Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3 //
3 ///////////////////////////////////////////////////////////////////////////
4 //
5 // A MOTD module for Corrade Eggdrop.
6 //
7 ///////////////////////////////////////////////////////////////////////////
24 office 8  
11 office 9 ///////////////////////////////////////////////////////////////////////////
10 // Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3 //
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 ///////////////////////////////////////////////////////////////////////////
22 // Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3 //
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 }
24 office 35  
11 office 36 ///////////////////////////////////////////////////////////////////////////
37 // Copyright (C) 2011 Wizardry and Steamworks - License: GNU GPLv3 //
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 }
24 office 47  
11 office 48 ///////////////////////////////////////////////////////////////////////////
49 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
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 }
24 office 71  
11 office 72 ///////////////////////////////////////////////////////////////////////////
73 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
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 }
24 office 110  
11 office 111 ///////////////////////////////////////////////////////////////////////////
112 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
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 }
24 office 139  
11 office 140 ///////////////////////////////////////////////////////////////////////////
141 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
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 }
24 office 163  
11 office 164 // configuration data
165 string configuration = "";
166 // callback URL
167 string URL = "";
168 // store message over state.
169 string firstname = "";
170 string lastname = "";
171 string group = "";
172 string data = "";
173 string jump_state = "";
24 office 174  
11 office 175 default {
176 state_entry() {
177 llOwnerSay("[MOTD] Starting module...");
178 llSetTimerEvent(10);
179 }
180 link_message(integer sender, integer num, string message, key id) {
181 if(id != "configuration") return;
182 llOwnerSay("[MOTD] Got configuration...");
183 configuration = message;
184 jump_state = "create_database";
185 state url;
186 }
187 timer() {
188 llOwnerSay("[MOTD] Requesting configuration...");
189 llMessageLinked(LINK_THIS, 0, "configuration", NULL_KEY);
190 }
191 on_rez(integer num) {
192 llResetScript();
193 }
194 changed(integer change) {
195 if((change & CHANGED_INVENTORY) ||
196 (change & CHANGED_REGION_START) ||
197 (change & CHANGED_OWNER)) {
198 llResetScript();
199 }
200 }
201 state_exit() {
202 llSetTimerEvent(0);
203 }
204 }
24 office 205  
11 office 206 state url {
207 state_entry() {
208 // DEBUG
209 llOwnerSay("[MOTD] Requesting URL...");
210 llRequestURL();
211 }
212 http_request(key id, string method, string body) {
213 if(method != URL_REQUEST_GRANTED) return;
214 URL = body;
215 // DEBUG
216 llOwnerSay("[MOTD] Got URL...");
217 if(jump_state == "create_database")
218 state create_database;
219 if(jump_state == "greet")
220 state greet;
221 if(jump_state == "get")
222 state get;
223 if(jump_state == "set")
224 state set;
225 if(jump_state == "listen_group")
226 state listen_group;
24 office 227  
11 office 228 // DEBUG
229 llOwnerSay("[MOTD] Jump table corrupted, please contact creator...");
230 llResetScript();
231 }
232 on_rez(integer num) {
233 llResetScript();
234 }
235 changed(integer change) {
236 if((change & CHANGED_INVENTORY) ||
237 (change & CHANGED_REGION_START) ||
238 (change & CHANGED_OWNER)) {
239 llResetScript();
240 }
241 }
242 }
24 office 243  
11 office 244 state create_database {
245 state_entry() {
246 // DEBUG
24 office 247 llOwnerSay("[MOTD] Creating database: " + wasKeyValueGet("motd table", configuration));
11 office 248 llInstantMessage(
249 wasKeyValueGet(
250 "corrade",
251 configuration
252 ),
253 wasKeyValueEncode(
254 [
255 "command", "database",
256 "group", wasURLEscape(
257 wasKeyValueGet(
258 "group",
259 configuration
260 )
261 ),
262 "password", wasURLEscape(
263 wasKeyValueGet(
264 "password",
265 configuration
266 )
267 ),
268 "SQL", wasURLEscape("CREATE TABLE IF NOT EXISTS \"" +
269 wasKeyValueGet("motd table", configuration) +
270 "\" (name text unique collate nocase, data text)"),
271 "callback", wasURLEscape(URL)
272 ]
273 )
274 );
275 llSetTimerEvent(60);
276 }
277 http_request(key id, string method, string body) {
278 llHTTPResponse(id, 200, "OK");
279 llReleaseURL(URL);
280 if(wasKeyValueGet("command", body) != "database" ||
281 wasKeyValueGet("success", body) != "True") {
282 // DEBUG
283 llOwnerSay("[MOTD] Unable modify database: " +
284 wasURLUnescape(
285 wasKeyValueGet("error", body)
24 office 286 ) +
287 " " +
288 wasURLUnescape(
289 wasKeyValueGet("data", body)
11 office 290 )
24 office 291  
11 office 292 );
293 llResetScript();
294 }
295 llOwnerSay("[MOTD] Database created!");
296 state listen_group;
297 }
298 timer() {
299 llReleaseURL(URL);
300 state listen_group;
301 }
302 on_rez(integer num) {
303 llResetScript();
304 }
305 changed(integer change) {
306 if((change & CHANGED_INVENTORY) ||
307 (change & CHANGED_REGION_START) ||
308 (change & CHANGED_OWNER)) {
309 llResetScript();
310 }
311 }
312 state_exit() {
313 llSetTimerEvent(0);
314 }
315 }
24 office 316  
317  
11 office 318 state listen_group {
319 state_entry() {
320 // DEBUG
321 llOwnerSay("[MOTD] Waiting for group messages and new group members.");
322 }
323 link_message(integer sender, integer num, string message, key id) {
324 // We only care about notifications now.
325 if(id != "notification")
326 return;
24 office 327  
11 office 328 // Get the group.
329 group = wasURLUnescape(
330 wasKeyValueGet(
331 "group",
332 message
333 )
334 );
24 office 335  
11 office 336 // Retrieve the membership notification.
337 if(wasKeyValueGet("type", message) == "membership" &&
338 wasKeyValueGet("action", message) == "joined") {
339 firstname = wasURLUnescape(
340 wasKeyValueGet(
341 "firstname",
342 message
343 )
344 );
345 lastname = wasURLUnescape(
346 wasKeyValueGet(
347 "lastname",
348 message
349 )
350 );
351 jump_state = "greet";
352 state url;
353 }
24 office 354  
11 office 355 // This script only processes group notifications.
356 if(wasKeyValueGet("type", message) != "group")
357 return;
24 office 358  
11 office 359 // Get the sent message.
360 data = wasURLUnescape(
361 wasKeyValueGet(
362 "message",
363 message
364 )
365 );
24 office 366  
11 office 367 // Check if this is an eggdrop command.
368 if(llGetSubString(data, 0, 0) !=
369 wasKeyValueGet("command", configuration))
370 return;
24 office 371  
11 office 372 // Check if the command matches the current module.
15 office 373 list command = llParseString2List(data, [" "], []);
374 if(llList2String(command, 0) !=
375 wasKeyValueGet("command", configuration) + "motd")
11 office 376 return;
24 office 377  
11 office 378 // Remove command.
379 command = llDeleteSubList(command, 0, 0);
24 office 380  
11 office 381 // Dump the rest of the message.
382 data = llDumpList2String(command, " ");
24 office 383  
11 office 384 // Get the sent message.
385 if(data == "") {
386 jump_state = "get";
387 state url;
388 }
24 office 389  
11 office 390 jump_state = "set";
391 state url;
392 }
393 on_rez(integer num) {
394 llResetScript();
395 }
396 changed(integer change) {
397 if((change & CHANGED_INVENTORY) ||
398 (change & CHANGED_REGION_START) ||
399 (change & CHANGED_OWNER)) {
400 llResetScript();
401 }
402 }
403 }
24 office 404  
11 office 405 state greet {
406 state_entry() {
407 // DEBUG
408 llOwnerSay("[MOTD] Member joined, retrieving MOTD...");
409 llInstantMessage(
410 wasKeyValueGet(
411 "corrade",
412 configuration
413 ),
414 wasKeyValueEncode(
415 [
416 "command", "database",
417 "group", wasURLEscape(
418 wasKeyValueGet(
419 "group",
420 configuration
421 )
422 ),
423 "password", wasURLEscape(
424 wasKeyValueGet(
425 "password",
426 configuration
427 )
428 ),
429 "SQL", wasURLEscape("SELECT data FROM \"" +
430 wasKeyValueGet("motd table", configuration) +
431 "\" WHERE name=:group"),
432 "data", wasURLEscape(
433 wasListToCSV(
434 [
435 "group",
436 wasURLEscape(group)
437 ]
438 )
439 ),
440 "callback", wasURLEscape(URL)
441 ]
442 )
443 );
444 llSetTimerEvent(60);
445 }
446 http_request(key id, string method, string body) {
447 llHTTPResponse(id, 200, "OK");
448 llReleaseURL(URL);
449 if(wasKeyValueGet("command", body) != "database" ||
450 wasKeyValueGet("success", body) != "True") {
451 // DEBUG
452 llOwnerSay("[MOTD] Unable retrieve from database: " +
453 wasURLUnescape(
454 wasKeyValueGet("error", body)
455 )
456 );
457 state listen_group;
458 }
24 office 459  
11 office 460 data = llDumpList2String(
461 llDeleteSubList(
462 wasCSVToList(
463 wasURLUnescape(
464 wasKeyValueGet("data", body)
465 )
466 ),
467 0,
468  
469 ),
470 ""
471 );
24 office 472  
11 office 473 if(data == "")
474 state listen_group;
24 office 475  
11 office 476 data = "Hello " + firstname + " " + lastname + "!" + " " + data;
477 state tell;
478 }
479 timer() {
480 llReleaseURL(URL);
481 state listen_group;
482 }
483 on_rez(integer num) {
484 llResetScript();
485 }
486 changed(integer change) {
487 if((change & CHANGED_INVENTORY) ||
488 (change & CHANGED_REGION_START) ||
489 (change & CHANGED_OWNER)) {
490 llResetScript();
491 }
492 }
493 state_exit() {
494 llSetTimerEvent(0);
495 }
496 }
24 office 497  
11 office 498 state get {
499 state_entry() {
500 // DEBUG
501 llOwnerSay("[MOTD] Retrieving from database.");
502 llInstantMessage(
503 wasKeyValueGet(
504 "corrade",
505 configuration
506 ),
507 wasKeyValueEncode(
508 [
509 "command", "database",
510 "group", wasURLEscape(
511 wasKeyValueGet(
512 "group",
513 configuration
514 )
515 ),
516 "password", wasURLEscape(
517 wasKeyValueGet(
518 "password",
519 configuration
520 )
521 ),
522 "SQL", wasURLEscape("SELECT data FROM \"" +
523 wasKeyValueGet("motd table", configuration) +
524 "\" WHERE name=:group"),
525 "data", wasURLEscape(
526 wasListToCSV(
527 [
528 "group",
24 office 529 wasURLEscape(
530 wasKeyValueGet(
531 "group",
532 configuration
533 )
534 )
11 office 535 ]
536 )
537 ),
538 "callback", wasURLEscape(URL)
539 ]
540 )
541 );
542 llSetTimerEvent(60);
543 }
544 http_request(key id, string method, string body) {
545 llHTTPResponse(id, 200, "OK");
546 llReleaseURL(URL);
547 if(wasKeyValueGet("command", body) != "database" ||
548 wasKeyValueGet("success", body) != "True") {
549 // DEBUG
550 llOwnerSay("[MOTD] Unable retrieve from database: " +
551 wasURLUnescape(
552 wasKeyValueGet("error", body)
553 )
554 );
555 state listen_group;
556 }
24 office 557  
11 office 558 data = llDumpList2String(
559 llDeleteSubList(
560 wasCSVToList(
561 wasURLUnescape(
562 wasKeyValueGet("data", body)
563 )
564 ),
565 0,
566  
567 ),
568 ""
569 );
24 office 570  
11 office 571 if(data == "") {
572 data = "Sorry, no MOTD is currently set.";
573 state tell;
574 }
24 office 575  
11 office 576 state tell;
577 }
578 timer() {
579 llReleaseURL(URL);
580 state listen_group;
581 }
582 on_rez(integer num) {
583 llResetScript();
584 }
585 changed(integer change) {
586 if((change & CHANGED_INVENTORY) ||
587 (change & CHANGED_REGION_START) ||
588 (change & CHANGED_OWNER)) {
589 llResetScript();
590 }
591 }
592 state_exit() {
593 llSetTimerEvent(0);
594 }
595 }
24 office 596  
11 office 597 state set {
598 state_entry() {
599 // DEBUG
600 llOwnerSay("[MOTD] Adding to database.");
601 llInstantMessage(
602 wasKeyValueGet(
603 "corrade",
604 configuration
605 ),
606 wasKeyValueEncode(
607 [
608 "command", "database",
609 "group", wasURLEscape(
610 wasKeyValueGet(
611 "group",
612 configuration
613 )
614 ),
615 "password", wasURLEscape(
616 wasKeyValueGet(
617 "password",
618 configuration
619 )
620 ),
621 "SQL", wasURLEscape("REPLACE INTO \"" +
622 wasKeyValueGet("motd table", configuration) +
623 "\" (name, data) VALUES (:name, :data)"),
624 "data", wasURLEscape(
625 wasListToCSV(
626 [
627 "name",
24 office 628 wasURLEscape(
629 wasKeyValueGet(
630 "group",
631 configuration
632 )
633 ),
11 office 634 "data",
635 wasURLEscape(data)
636 ]
637 )
638 ),
639 "callback", wasURLEscape(URL)
640 ]
641 )
642 );
643 llSetTimerEvent(60);
644 }
645 http_request(key id, string method, string body) {
646 llHTTPResponse(id, 200, "OK");
647 llReleaseURL(URL);
648 if(wasKeyValueGet("command", body) != "database" ||
649 wasKeyValueGet("success", body) != "True") {
650 // DEBUG
651 llOwnerSay("[MOTD] Unable modify database: " +
652 wasURLUnescape(
653 wasKeyValueGet("error", body)
654 )
655 );
656 state listen_group;
657 }
658 data = "Saved";
659 state tell;
660 }
661 timer() {
662 llReleaseURL(URL);
663 state listen_group;
664 }
665 on_rez(integer num) {
666 llResetScript();
667 }
668 changed(integer change) {
669 if((change & CHANGED_INVENTORY) ||
670 (change & CHANGED_REGION_START) ||
671 (change & CHANGED_OWNER)) {
672 llResetScript();
673 }
674 }
675 state_exit() {
676 llSetTimerEvent(0);
677 }
678 }
24 office 679  
11 office 680 state tell {
681 state_entry() {
682 // DEBUG
683 llOwnerSay("[MOTD] Sending to group.");
684 llInstantMessage(
685 wasKeyValueGet(
686 "corrade",
687 configuration
688 ),
689 wasKeyValueEncode(
690 [
691 "command", "tell",
692 "group", wasURLEscape(
693 wasKeyValueGet(
694 "group",
695 configuration
696 )
697 ),
698 "password", wasURLEscape(
699 wasKeyValueGet(
700 "password",
701 configuration
702 )
703 ),
704 "entity", "group",
705 "message", wasURLEscape(data)
706 ]
707 )
708 );
709 state listen_group;
710 }
711 }