corrade-lsl-templates – Diff between revs 41 and 42

Subversion Repositories:
Rev:
Only display areas with differencesIgnore whitespace
Rev 41 Rev 42
1 /////////////////////////////////////////////////////////////////////////// 1 ///////////////////////////////////////////////////////////////////////////
2 // Copyright (C) Wizardry and Steamworks 2016 - License: CC BY 2.0 // 2 // Copyright (C) Wizardry and Steamworks 2016 - License: GNU GPLv3 //
3 /////////////////////////////////////////////////////////////////////////// 3 ///////////////////////////////////////////////////////////////////////////
4 // 4 //
5 // A module that invites people to the group members. 5 // A module that invites people to the group members.
6 // 6 //
7 /////////////////////////////////////////////////////////////////////////// 7 ///////////////////////////////////////////////////////////////////////////
8   8  
9 /////////////////////////////////////////////////////////////////////////// 9 ///////////////////////////////////////////////////////////////////////////
10 // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 // 10 // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 //
11 /////////////////////////////////////////////////////////////////////////// 11 ///////////////////////////////////////////////////////////////////////////
12 string wasKeyValueGet(string k, string data) { 12 string wasKeyValueGet(string k, string data) {
13 if(llStringLength(data) == 0) return ""; 13 if(llStringLength(data) == 0) return "";
14 if(llStringLength(k) == 0) return ""; 14 if(llStringLength(k) == 0) return "";
15 list a = llParseStringKeepNulls(data, ["&", "="], []); 15 list a = llParseStringKeepNulls(data, ["&", "="], []);
16 integer i = llListFindList(llList2ListStrided(a, 0, -1, 2), [ k ]); 16 integer i = llListFindList(llList2ListStrided(a, 0, -1, 2), [ k ]);
17 if(i != -1) return llList2String(a, 2*i+1); 17 if(i != -1) return llList2String(a, 2*i+1);
18 return ""; 18 return "";
19 } 19 }
20 20  
21 /////////////////////////////////////////////////////////////////////////// 21 ///////////////////////////////////////////////////////////////////////////
22 // Copyright (C) 2013 Wizardry and Steamworks - License: CC BY 2.0 // 22 // Copyright (C) 2013 Wizardry and Steamworks - License: GNU GPLv3 //
23 /////////////////////////////////////////////////////////////////////////// 23 ///////////////////////////////////////////////////////////////////////////
24 string wasKeyValueEncode(list data) { 24 string wasKeyValueEncode(list data) {
25 list k = llList2ListStrided(data, 0, -1, 2); 25 list k = llList2ListStrided(data, 0, -1, 2);
26 list v = llList2ListStrided(llDeleteSubList(data, 0, 0), 0, -1, 2); 26 list v = llList2ListStrided(llDeleteSubList(data, 0, 0), 0, -1, 2);
27 data = []; 27 data = [];
28 do { 28 do {
29 data += llList2String(k, 0) + "=" + llList2String(v, 0); 29 data += llList2String(k, 0) + "=" + llList2String(v, 0);
30 k = llDeleteSubList(k, 0, 0); 30 k = llDeleteSubList(k, 0, 0);
31 v = llDeleteSubList(v, 0, 0); 31 v = llDeleteSubList(v, 0, 0);
32 } while(llGetListLength(k) != 0); 32 } while(llGetListLength(k) != 0);
33 return llDumpList2String(data, "&"); 33 return llDumpList2String(data, "&");
34 } 34 }
35   35  
36 /////////////////////////////////////////////////////////////////////////// 36 ///////////////////////////////////////////////////////////////////////////
37 // Copyright (C) 2011 Wizardry and Steamworks - License: CC BY 2.0 // 37 // Copyright (C) 2011 Wizardry and Steamworks - License: GNU GPLv3 //
38 /////////////////////////////////////////////////////////////////////////// 38 ///////////////////////////////////////////////////////////////////////////
39 // http://was.fm/secondlife/wanderer 39 // http://was.fm/secondlife/wanderer
40 vector wasCirclePoint(float radius) { 40 vector wasCirclePoint(float radius) {
41 float x = llPow(-1, 1 + (integer) llFrand(2)) * llFrand(radius*2); 41 float x = llPow(-1, 1 + (integer) llFrand(2)) * llFrand(radius*2);
42 float y = 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)) 43 if(llPow(x,2) + llPow(y,2) <= llPow(radius,2))
44 return <x, y, 0>; 44 return <x, y, 0>;
45 return wasCirclePoint(radius); 45 return wasCirclePoint(radius);
46 } 46 }
47   47  
48 /////////////////////////////////////////////////////////////////////////// 48 ///////////////////////////////////////////////////////////////////////////
49 // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 // 49 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
50 /////////////////////////////////////////////////////////////////////////// 50 ///////////////////////////////////////////////////////////////////////////
51 // escapes a string in conformance with RFC1738 51 // escapes a string in conformance with RFC1738
52 string wasURLEscape(string i) { 52 string wasURLEscape(string i) {
53 string o = ""; 53 string o = "";
54 do { 54 do {
55 string c = llGetSubString(i, 0, 0); 55 string c = llGetSubString(i, 0, 0);
56 i = llDeleteSubString(i, 0, 0); 56 i = llDeleteSubString(i, 0, 0);
57 if(c == "") jump continue; 57 if(c == "") jump continue;
58 if(c == " ") { 58 if(c == " ") {
59 o += "+"; 59 o += "+";
60 jump continue; 60 jump continue;
61 } 61 }
62 if(c == "\n") { 62 if(c == "\n") {
63 o += "%0D" + llEscapeURL(c); 63 o += "%0D" + llEscapeURL(c);
64 jump continue; 64 jump continue;
65 } 65 }
66 o += llEscapeURL(c); 66 o += llEscapeURL(c);
67 @continue; 67 @continue;
68 } while(i != ""); 68 } while(i != "");
69 return o; 69 return o;
70 } 70 }
71   71  
72 /////////////////////////////////////////////////////////////////////////// 72 ///////////////////////////////////////////////////////////////////////////
73 // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 // 73 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
74 /////////////////////////////////////////////////////////////////////////// 74 ///////////////////////////////////////////////////////////////////////////
75 list wasCSVToList(string csv) { 75 list wasCSVToList(string csv) {
76 list l = []; 76 list l = [];
77 list s = []; 77 list s = [];
78 string m = ""; 78 string m = "";
79 do { 79 do {
80 string a = llGetSubString(csv, 0, 0); 80 string a = llGetSubString(csv, 0, 0);
81 csv = llDeleteSubString(csv, 0, 0); 81 csv = llDeleteSubString(csv, 0, 0);
82 if(a == ",") { 82 if(a == ",") {
83 if(llList2String(s, -1) != "\"") { 83 if(llList2String(s, -1) != "\"") {
84 l += m; 84 l += m;
85 m = ""; 85 m = "";
86 jump continue; 86 jump continue;
87 } 87 }
88 m += a; 88 m += a;
89 jump continue; 89 jump continue;
90 } 90 }
91 if(a == "\"" && llGetSubString(csv, 0, 0) == a) { 91 if(a == "\"" && llGetSubString(csv, 0, 0) == a) {
92 m += a; 92 m += a;
93 csv = llDeleteSubString(csv, 0, 0); 93 csv = llDeleteSubString(csv, 0, 0);
94 jump continue; 94 jump continue;
95 } 95 }
96 if(a == "\"") { 96 if(a == "\"") {
97 if(llList2String(s, -1) != a) { 97 if(llList2String(s, -1) != a) {
98 s += a; 98 s += a;
99 jump continue; 99 jump continue;
100 } 100 }
101 s = llDeleteSubList(s, -1, -1); 101 s = llDeleteSubList(s, -1, -1);
102 jump continue; 102 jump continue;
103 } 103 }
104 m += a; 104 m += a;
105 @continue; 105 @continue;
106 } while(csv != ""); 106 } while(csv != "");
107 // postcondition: length(s) = 0 107 // postcondition: length(s) = 0
108 return l + m; 108 return l + m;
109 } 109 }
110   110  
111 /////////////////////////////////////////////////////////////////////////// 111 ///////////////////////////////////////////////////////////////////////////
112 // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 // 112 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
113 /////////////////////////////////////////////////////////////////////////// 113 ///////////////////////////////////////////////////////////////////////////
114 string wasListToCSV(list l) { 114 string wasListToCSV(list l) {
115 list v = []; 115 list v = [];
116 do { 116 do {
117 string a = llDumpList2String( 117 string a = llDumpList2String(
118 llParseStringKeepNulls( 118 llParseStringKeepNulls(
119 llList2String( 119 llList2String(
120 l, 120 l,
121 0 121 0
122 ), 122 ),
123 ["\""], 123 ["\""],
124 [] 124 []
125 ), 125 ),
126 "\"\"" 126 "\"\""
127 ); 127 );
128 if(llParseStringKeepNulls( 128 if(llParseStringKeepNulls(
129 a, 129 a,
130 [" ", ",", "\n", "\""], [] 130 [" ", ",", "\n", "\""], []
131 ) != 131 ) !=
132 (list) a 132 (list) a
133 ) a = "\"" + a + "\""; 133 ) a = "\"" + a + "\"";
134 v += a; 134 v += a;
135 l = llDeleteSubList(l, 0, 0); 135 l = llDeleteSubList(l, 0, 0);
136 } while(l != []); 136 } while(l != []);
137 return llDumpList2String(v, ","); 137 return llDumpList2String(v, ",");
138 } 138 }
139   139  
140 /////////////////////////////////////////////////////////////////////////// 140 ///////////////////////////////////////////////////////////////////////////
141 // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 // 141 // Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3 //
142 /////////////////////////////////////////////////////////////////////////// 142 ///////////////////////////////////////////////////////////////////////////
143 // unescapes a string in conformance with RFC1738 143 // unescapes a string in conformance with RFC1738
144 string wasURLUnescape(string i) { 144 string wasURLUnescape(string i) {
145 return llUnescapeURL( 145 return llUnescapeURL(
146 llDumpList2String( 146 llDumpList2String(
147 llParseString2List( 147 llParseString2List(
148 llDumpList2String( 148 llDumpList2String(
149 llParseString2List( 149 llParseString2List(
150 i, 150 i,
151 ["+"], 151 ["+"],
152 [] 152 []
153 ), 153 ),
154 " " 154 " "
155 ), 155 ),
156 ["%0D%0A"], 156 ["%0D%0A"],
157 [] 157 []
158 ), 158 ),
159 "\n" 159 "\n"
160 ) 160 )
161 ); 161 );
162 } 162 }
163   163  
164 // configuration data 164 // configuration data
165 string configuration = ""; 165 string configuration = "";
166 // callback URL -  
167 string URL = ""; -  
168 // store message over state. 166 // store message over state.
169 string data = ""; 167 string data = "";
170 string firstname = ""; 168 string firstname = "";
171 string lastname = ""; 169 string lastname = "";
172   170  
173 default { 171 default {
174 state_entry() { 172 state_entry() {
175 llOwnerSay("[Invite] Starting..."); 173 llOwnerSay("[Invite] Starting...");
176 llSetTimerEvent(10); 174 llSetTimerEvent(10);
177 } 175 }
178 link_message(integer sender, integer num, string message, key id) { 176 link_message(integer sender, integer num, string message, key id) {
179 if(id != "configuration") return; 177 if(id != "configuration") return;
180 llOwnerSay("[Invite] Got configuration..."); 178 llOwnerSay("[Invite] Got configuration...");
181 configuration = message; 179 configuration = message;
182 state listen_group; 180 state listen_group;
183 } 181 }
184 timer() { 182 timer() {
185 llOwnerSay("[Invite] Requesting configuration..."); 183 llOwnerSay("[Invite] Requesting configuration...");
186 llMessageLinked(LINK_THIS, 0, "configuration", NULL_KEY); 184 llMessageLinked(LINK_THIS, 0, "configuration", NULL_KEY);
187 } 185 }
188 on_rez(integer num) { 186 on_rez(integer num) {
189 llResetScript(); 187 llResetScript();
190 } 188 }
191 changed(integer change) { 189 changed(integer change) {
192 if((change & CHANGED_INVENTORY) || 190 if((change & CHANGED_INVENTORY) ||
193 (change & CHANGED_REGION_START) || 191 (change & CHANGED_REGION_START) ||
194 (change & CHANGED_OWNER)) { 192 (change & CHANGED_OWNER)) {
195 llResetScript(); 193 llResetScript();
196 } 194 }
197 } 195 }
198 state_exit() { 196 state_exit() {
199 llSetTimerEvent(0); 197 llSetTimerEvent(0);
200 } 198 }
201 } 199 }
202   200  
203 state listen_group { 201 state listen_group {
204 state_entry() { 202 state_entry() {
205 // DEBUG 203 // DEBUG
206 llOwnerSay("[Invite] Waiting for group messages..."); 204 llOwnerSay("[Invite] Waiting for group messages...");
207 } 205 }
208 link_message(integer sender, integer num, string message, key id) { 206 link_message(integer sender, integer num, string message, key id) {
209 // We only care about notifications now. 207 // We only care about notifications now.
210 if(id != "notification") 208 if(id != "notification")
211 return; 209 return;
212 210  
213 // This script only processes group notifications. 211 // This script only processes group notifications.
214 if(wasKeyValueGet("type", message) != "group") 212 if(wasKeyValueGet("type", message) != "group" ||
-   213 (wasKeyValueGet("type", message) == "group" &&
-   214 wasURLUnescape(wasKeyValueGet("group", message)) !=
-   215 wasKeyValueGet("group", configuration)))
215 return; 216 return;
216 217  
217 // Get the sent message. 218 // Get the sent message.
218 data = wasURLUnescape( 219 data = wasURLUnescape(
219 wasKeyValueGet( 220 wasKeyValueGet(
220 "message", 221 "message",
221 message 222 message
222 ) 223 )
223 ); 224 );
224 225  
225 // Check if this is an eggdrop command. 226 // Check if this is an eggdrop command.
226 if(llGetSubString(data, 0, 0) != 227 if(llGetSubString(data, 0, 0) !=
227 wasKeyValueGet("command", configuration)) 228 wasKeyValueGet("command", configuration))
228 return; 229 return;
229 230  
230 // Check if the command matches the current module. 231 // Check if the command matches the current module.
231 list command = llParseString2List(data, [" "], []); 232 list command = llParseString2List(data, [" "], []);
232 if(llList2String(command, 0) != 233 if(llList2String(command, 0) !=
233 wasKeyValueGet("command", configuration) + "invite") 234 wasKeyValueGet("command", configuration) + "invite")
234 return; 235 return;
235 236  
236 // Remove command. 237 // Remove command.
237 command = llDeleteSubList(command, 0, 0); 238 command = llDeleteSubList(command, 0, 0);
238 239  
239 // Dump the rest of the message. 240 // Dump the rest of the message.
240 data = llDumpList2String(command, " "); 241 data = llDumpList2String(command, " ");
241 -  
242 // Get an URL. -  
243 state url; -  
244 } -  
245 on_rez(integer num) { -  
246 llResetScript(); -  
247 } -  
248 changed(integer change) { -  
249 if((change & CHANGED_INVENTORY) || -  
250 (change & CHANGED_REGION_START) || -  
251 (change & CHANGED_OWNER)) { -  
252 llResetScript(); -  
253 } -  
254 } -  
255 } -  
256   -  
257 state url { -  
258 state_entry() { -  
259 // DEBUG -  
260 llOwnerSay("[Invite] Requesting URL..."); 242  
261 llRequestURL(); -  
262 } -  
263 http_request(key id, string method, string body) { -  
264 if(method != URL_REQUEST_GRANTED) return; -  
265 URL = body; -  
266 // DEBUG -  
267 llOwnerSay("[Invite] Got URL..."); 243 // Search for agent.
268 state search; 244 state search;
269 } 245 }
270 on_rez(integer num) { 246 on_rez(integer num) {
271 llResetScript(); 247 llResetScript();
272 } 248 }
273 changed(integer change) { 249 changed(integer change) {
274 if((change & CHANGED_INVENTORY) || 250 if((change & CHANGED_INVENTORY) ||
275 (change & CHANGED_REGION_START) || 251 (change & CHANGED_REGION_START) ||
276 (change & CHANGED_OWNER)) { 252 (change & CHANGED_OWNER)) {
277 llResetScript(); 253 llResetScript();
278 } 254 }
279 } 255 }
280 } 256 }
281   257  
282 state search { 258 state search {
283 state_entry() { 259 state_entry() {
284 // DEBUG 260 // DEBUG
285 llOwnerSay("[Invite] Searching for agent."); 261 llOwnerSay("[Invite] Searching for agent.");
286 llInstantMessage( 262 llInstantMessage(
287 wasKeyValueGet( 263 wasKeyValueGet(
288 "corrade", 264 "corrade",
289 configuration 265 configuration
290 ), 266 ),
291 wasKeyValueEncode( 267 wasKeyValueEncode(
292 [ 268 [
293 "command", "directorysearch", 269 "command", "directorysearch",
294 "group", wasURLEscape( 270 "group", wasURLEscape(
295 wasKeyValueGet( 271 wasKeyValueGet(
296 "group", 272 "group",
297 configuration 273 configuration
298 ) 274 )
299 ), 275 ),
300 "password", wasURLEscape( 276 "password", wasURLEscape(
301 wasKeyValueGet( 277 wasKeyValueGet(
302 "password", 278 "password",
303 configuration 279 configuration
304 ) 280 )
305 ), 281 ),
306 "type", "people", 282 "type", "people",
307 "name", wasURLEscape(data), 283 "name", wasURLEscape(data),
308 /*"sift", wasURLEscape( 284 /*"sift", wasURLEscape(
309 wasListToCSV( 285 wasListToCSV(
310 [ 286 [
311 "match", 287 "match",
312 wasURLEscape("(?i),?([^,$]*" + data +"[^,$]*),?") 288 wasURLEscape("(?i),?([^,$]*" + data +"[^,$]*),?")
313 ] 289 ]
314 ) 290 )
315 ),*/ 291 ),*/
316 "callback", wasURLEscape(URL) 292 "callback", wasURLEscape(
-   293 wasKeyValueGet(
-   294 "URL",
-   295 configuration
-   296 )
-   297 )
317 ] 298 ]
318 ) 299 )
319 ); 300 );
320 llSetTimerEvent(60); 301 llSetTimerEvent(60);
321 } 302 }
322 http_request(key id, string method, string body) { 303 link_message(integer sender, integer num, string body, key id) {
323 llHTTPResponse(id, 200, "OK"); 304 // Only process callbacks for the database command.
324 if(wasKeyValueGet("command", body) != "directorysearch" || 305 if(id != "callback" || wasKeyValueGet("command", body) != "directorysearch")
-   306 return;
-   307  
325 wasKeyValueGet("success", body) != "True") { 308 if(wasKeyValueGet("success", body) != "True") {
326 // DEBUG 309 // DEBUG
327 llOwnerSay("[Invite] Unable to search for agent: " + 310 llOwnerSay("[Invite] Unable to search for agent: " +
328 wasURLUnescape( 311 wasURLUnescape(
329 wasKeyValueGet("error", body) 312 wasKeyValueGet("error", body)
330 ) 313 )
331 ); 314 );
332 llReleaseURL(URL); -  
333 state listen_group; 315 state listen_group;
334 } 316 }
335 317  
336 list first_last = llParseString2List(data, [" "], []); 318 list first_last = llParseString2List(data, [" "], []);
337 firstname = llList2String(first_last, 0); 319 firstname = llList2String(first_last, 0);
338 lastname = llList2String(first_last, 1); 320 lastname = llList2String(first_last, 1);
339 321  
340 list found_agent = wasCSVToList( 322 list found_agent = wasCSVToList(
341 wasURLUnescape( 323 wasURLUnescape(
342 wasKeyValueGet("data", body) 324 wasKeyValueGet("data", body)
343 ) 325 )
344 ); 326 );
345 327  
346 if(llToUpper( 328 if(llToUpper(
347 llList2String( 329 llList2String(
348 found_agent, 330 found_agent,
349 llListFindList( 331 llListFindList(
350 found_agent, 332 found_agent,
351 (list)"FirstName" 333 (list)"FirstName"
352 ) + 1 334 ) + 1
353 ) 335 )
354 ) != llToUpper(firstname) || 336 ) != llToUpper(firstname) ||
355 llToUpper( 337 llToUpper(
356 llList2String( 338 llList2String(
357 found_agent, 339 found_agent,
358 llListFindList( 340 llListFindList(
359 found_agent, 341 found_agent,
360 (list)"LastName" 342 (list)"LastName"
361 ) + 1 343 ) + 1
362 ) 344 )
363 ) != llToUpper(lastname)) { 345 ) != llToUpper(lastname)) {
364 data = "Agent not found."; 346 data = "Agent not found.";
365 llReleaseURL(URL); -  
366 state tell; 347 state tell;
367 } 348 }
368 349  
369 state invite; 350 state invite;
370 } 351 }
371 timer() { 352 timer() {
372 llReleaseURL(URL); -  
373 state listen_group; 353 state listen_group;
374 } 354 }
375 on_rez(integer num) { 355 on_rez(integer num) {
376 llResetScript(); 356 llResetScript();
377 } 357 }
378 changed(integer change) { 358 changed(integer change) {
379 if((change & CHANGED_INVENTORY) || 359 if((change & CHANGED_INVENTORY) ||
380 (change & CHANGED_REGION_START) || 360 (change & CHANGED_REGION_START) ||
381 (change & CHANGED_OWNER)) { 361 (change & CHANGED_OWNER)) {
382 llResetScript(); 362 llResetScript();
383 } 363 }
384 } 364 }
385 state_exit() { 365 state_exit() {
386 llSetTimerEvent(0); 366 llSetTimerEvent(0);
387 } 367 }
388 } 368 }
389   369  
390 state invite { 370 state invite {
391 state_entry() { 371 state_entry() {
392 // DEBUG 372 // DEBUG
393 llOwnerSay("[Invite] inviting..."); 373 llOwnerSay("[Invite] inviting...");
394 llInstantMessage( 374 llInstantMessage(
395 wasKeyValueGet( 375 wasKeyValueGet(
396 "corrade", 376 "corrade",
397 configuration 377 configuration
398 ), 378 ),
399 wasKeyValueEncode( 379 wasKeyValueEncode(
400 [ 380 [
401 "command", "invite", 381 "command", "invite",
402 "group", wasURLEscape( 382 "group", wasURLEscape(
403 wasKeyValueGet( 383 wasKeyValueGet(
404 "group", 384 "group",
405 configuration 385 configuration
406 ) 386 )
407 ), 387 ),
408 "password", wasURLEscape( 388 "password", wasURLEscape(
409 wasKeyValueGet( 389 wasKeyValueGet(
410 "password", 390 "password",
411 configuration 391 configuration
412 ) 392 )
413 ), 393 ),
414 "firstname", firstname, 394 "firstname", firstname,
415 "lastname", lastname, 395 "lastname", lastname,
416 "soft", "True", 396 "soft", "True",
417 "verify", "False", 397 "verify", "False",
418 "callback", wasURLEscape(URL) 398 "callback", wasURLEscape(
-   399 wasKeyValueGet(
-   400 "URL",
-   401 configuration
-   402 )
-   403 )
419 ] 404 ]
420 ) 405 )
421 ); 406 );
422 llSetTimerEvent(60); 407 llSetTimerEvent(60);
423 } 408 }
424 http_request(key id, string method, string body) { 409 link_message(integer sender, integer num, string body, key id) {
425 llHTTPResponse(id, 200, "OK"); 410 // Only process callbacks for the database command.
426 llReleaseURL(URL); -  
427 if(wasKeyValueGet("command", body) != "invite" || 411 if(id != "callback" || wasKeyValueGet("command", body) != "invite")
-   412 return;
-   413  
428 wasKeyValueGet("success", body) != "True") { 414 if(wasKeyValueGet("success", body) != "True") {
429 // DEBUG 415 // DEBUG
430 llOwnerSay("[Eject] Unable to invite agent: " + 416 llOwnerSay("[Eject] Unable to invite agent: " +
431 wasURLUnescape( 417 wasURLUnescape(
432 wasKeyValueGet("error", body) 418 wasKeyValueGet("error", body)
433 ) 419 )
434 ); 420 );
435 state listen_group; 421 state listen_group;
436 } 422 }
437 423  
438 data = "Butters (Jym) was sent to pick them up!"; 424 data = "Butters (Jym) was sent to pick them up!";
439 425  
440 state tell; 426 state tell;
441 } 427 }
442 timer() { 428 timer() {
443 llReleaseURL(URL); -  
444 state listen_group; 429 state listen_group;
445 } 430 }
446 on_rez(integer num) { 431 on_rez(integer num) {
447 llResetScript(); 432 llResetScript();
448 } 433 }
449 changed(integer change) { 434 changed(integer change) {
450 if((change & CHANGED_INVENTORY) || 435 if((change & CHANGED_INVENTORY) ||
451 (change & CHANGED_REGION_START) || 436 (change & CHANGED_REGION_START) ||
452 (change & CHANGED_OWNER)) { 437 (change & CHANGED_OWNER)) {
453 llResetScript(); 438 llResetScript();
454 } 439 }
455 } 440 }
456 state_exit() { 441 state_exit() {
457 llSetTimerEvent(0); 442 llSetTimerEvent(0);
458 } 443 }
459 } 444 }
460   445  
461 state tell { 446 state tell {
462 state_entry() { 447 state_entry() {
463 // DEBUG 448 // DEBUG
464 llOwnerSay("[Invite] Sending to group."); 449 llOwnerSay("[Invite] Sending to group.");
465 llInstantMessage( 450 llInstantMessage(
466 wasKeyValueGet( 451 wasKeyValueGet(
467 "corrade", 452 "corrade",
468 configuration 453 configuration
469 ), 454 ),
470 wasKeyValueEncode( 455 wasKeyValueEncode(
471 [ 456 [
472 "command", "tell", 457 "command", "tell",
473 "group", wasURLEscape( 458 "group", wasURLEscape(
474 wasKeyValueGet( 459 wasKeyValueGet(
475 "group", 460 "group",
476 configuration 461 configuration
477 ) 462 )
478 ), 463 ),
479 "password", wasURLEscape( 464 "password", wasURLEscape(
480 wasKeyValueGet( 465 wasKeyValueGet(
481 "password", 466 "password",
482 configuration 467 configuration
483 ) 468 )
484 ), 469 ),
485 "entity", "group", 470 "entity", "group",
486 "message", wasURLEscape(data) 471 "message", wasURLEscape(data)
487 ] 472 ]
488 ) 473 )
489 ); 474 );
490 state listen_group; 475 state listen_group;
491 } 476 }
492 } 477 }
493   478