string SERVER = "http://your.server.org"; integer TIME_BTW_SAVES = 5; key request_key; integer listener_id; list statements; integer sendable; string to_query_string(list parameters) { list body_list = []; integer length = llGetListLength(parameters); integer x; for (x = 0; x < length; x += 2) { string arg_pair = llEscapeURL(llList2String(parameters,x)) + "=" + llEscapeURL(llList2String(parameters,x+1)); body_list += [arg_pair]; } return llDumpList2String(body_list, "&"); } key do_post(string url, list parameters) { return llHTTPRequest(url, [HTTP_METHOD,"POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"], to_query_string(parameters)); } process_statement(string name, key id, string msg) { statements = (statements=[]) + statements + [name, id, msg, llGetTimestamp()]; } send_statements() { if(listener_id <= 0 || !sendable || llGetListLength(statements) <= 0) { return; } integer length = llGetListLength(statements); integer x; integer count = 0; list parameters = []; for(x = 0; x < length; x += 4) { parameters += ["statements[" + (string) count + "][agent_name]", llList2String(statements, x)]; parameters += ["statements[" + (string) count + "][agent_key]", llList2Key(statements, x+1)]; parameters += ["statements[" + (string) count + "][content]", llList2String(statements, x+2)]; parameters += ["statements[" + (string) count + "][spoken_at]", llList2String(statements, x+3)]; count += 1; } do_post(SERVER + "/listeners/" + (string) listener_id + "/statements", parameters); sendable = 0; statements = []; } default { state_entry() { llSetTouchText("on/off"); state not_recording; } } state not_recording { state_entry() { llSetText("listener (inactive)", <1,1,1>, 1); } touch(integer total_number) { state recording; } } state recording { state_entry() { sendable = 0; statements = []; listener_id = 0; request_key = do_post(SERVER + "/listeners", []); llSetTimerEvent(TIME_BTW_SAVES); llListen(0,"","",""); } state_exit() { llSetTimerEvent(0); } touch(integer total_number) { state default; } listen( integer chan, string name, key id, string msg ) { process_statement(name, id, msg); send_statements(); } timer() { sendable = 1; send_statements(); } http_response( key reqid, integer status, list meta, string body ) { if(reqid == request_key && status < 300) { listener_id = (integer) body; llSetText("listener " + (string) listener_id, <1,0,0>, 1); }else{ } } }