Advertisement
Mayumi_H

Avatar Online tracking with discord webhook.lsl

Jul 30th, 2020 (edited)
1,004
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //MH+ presents, super simple Online tracking with discord webhook
  2. //join us! => https://discord.link/SLguru
  3. //
  4. // 参考:https://discord.com/developers/docs/resources/webhook
  5.  
  6. //設定必須 (modify required) ///////////////////////////////////////////////////
  7. string AvatarNAME  = "";
  8. string WEBHOOK_URL = "";
  9. integer Time_Offset = 9; //日本時間(JST)
  10.  
  11. ////////////////////////////////////////////////////////////////////////////////
  12. // こんな感じでURLが払い出されます
  13. // WEBHOOK_URL =
  14. // |----------------------------------------------------------------------------------------------------------------------|
  15. // https://discord.com/api/webhooks/123456789012345678/abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcd
  16. //                                 |~~~~~~~~~~~~~~~~~~|
  17. //                                 |WEBHOOK_CHANNEL = |
  18. //                                                    |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  19. //                                                    |WEBHOOK_TOKEN =
  20. ////////////////////////////////////////////////////////////////////////////////
  21.  
  22. string User_NAME = "";
  23. string User_DISP = "";
  24. key    User_UUID;
  25. key    QUERY_KEY;
  26. key    REQUEST_KEY;
  27. integer FLG_ONLINE;
  28.  
  29. //
  30. // from : http://wiki.secondlife.com/wiki/GetTimestampOffset
  31. string  sbGetTimestamp(integer  intOffset) {
  32.     // Start with December for purposes of wrapping
  33.     list    lstDays  = [31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  34.  
  35.     string  strTimestamp = llGetTimestamp();
  36.  
  37.     list    lstTime  = llParseString2List(strTimestamp, ["-", ":", ".", "T"], []);
  38.     integer intYear  = llList2Integer(lstTime, 0);
  39.     integer intMonth = llList2Integer(lstTime, 1);
  40.     integer intDay   = llList2Integer(lstTime, 2);
  41.     integer intHour  = llList2Integer(lstTime, 3);
  42.  
  43.     string  strYear;
  44.     string  strMonth;
  45.     string  strDay;
  46.     string  strHour;
  47.  
  48.     if (intOffset == 0) { return strTimestamp; }
  49.  
  50.     if (intOffset < -24 || intOffset > 24) {
  51.         intOffset = ((integer)llGetWallclock() - (integer)llGetGMTclock()) / 3600;
  52.     }
  53.  
  54.     intHour+= intOffset;
  55.  
  56.     // Add a day to February in leap years
  57.     if (intYear % 4 == 0 && (intYear % 100 != 0 || intYear % 400 == 0)) {
  58.         lstDays = llListReplaceList(lstDays, [29], 2, 2);
  59.     }
  60.  
  61.     if (intOffset < 0) {
  62.         if (intHour < 0) {
  63.             intHour+= 24;
  64.             --intDay;
  65.         }
  66.  
  67.         if (intDay < 1) {
  68.             intDay = llList2Integer(lstDays, --intMonth);
  69.         }
  70.  
  71.         if (intMonth < 1) {
  72.             intMonth = 12;
  73.             --intYear;
  74.         }
  75.     }
  76.  
  77.     if (intOffset > 0) {
  78.         if (intHour > 23) {
  79.             intHour-= 24;
  80.             ++intDay;
  81.         }
  82.  
  83.         if (intDay > llList2Integer(lstDays, intMonth)) {
  84.             intDay = 1;
  85.             ++intMonth;
  86.         }
  87.  
  88.         if (intMonth > 12) {
  89.             intMonth = 1;
  90.             ++intYear;
  91.         }
  92.     }
  93.  
  94.     strYear  = (string)intYear;
  95.     strMonth = (string)intMonth;
  96.     strDay   = (string)intDay;
  97.     strHour  = (string)intHour;
  98.  
  99.     if (llStringLength(strMonth) < 2) { strMonth = "0" + strMonth; }
  100.     if (llStringLength(strDay)   < 2) { strDay   = "0" + strDay;   }
  101.     if (llStringLength(strHour)  < 2) { strHour  = "0" + strHour;  }
  102.  
  103.     return
  104.         strYear                   + "-" +
  105.         strMonth                  + "-" +
  106.         strDay                    + " " +
  107.         strHour                   + ":" +
  108.         llList2String(lstTime, 4) + ":" +
  109.         llList2String(lstTime, 5) ;//+ "." +
  110.         //llList2String(lstTime, 6) + "Z";
  111.         // Obviously this isn't really Z time anymore, but I left it there in case there
  112.         // are scripts expecting it.
  113. }
  114.  
  115.  
  116. default{//ユーザー名から正規のNAMEとUUIDと表示名を取得
  117.     on_rez(integer i){
  118.         llResetScript();
  119.     }
  120.  
  121.     state_entry(){
  122.         //アバター名があれば
  123.         if(AvatarNAME != ""){
  124.             //アバター名から取得
  125.             User_NAME = "";
  126.             User_DISP = "";
  127.             User_UUID = NULL_KEY;
  128.             QUERY_KEY = llRequestUserKey(AvatarNAME);
  129.         }else{
  130.             llOwnerSay("スクリプトを編集し、対象のアバター名(AvatarNAME)を設定してください。");
  131.         }
  132.     }
  133.  
  134.     dataserver(key requestID, string data) {
  135.         if(requestID == QUERY_KEY){
  136.             if(User_UUID == NULL_KEY){
  137.                 if((key)data){
  138.                     User_UUID = (key)data;
  139.                     llOwnerSay("アバターのUUID取得 OK : " + (string)User_UUID);
  140.                     QUERY_KEY = llRequestUsername(User_UUID);
  141.                 }else{
  142.                     llOwnerSay("このグリッドには存在しないアバターです。 : " + AvatarNAME);
  143.                 }
  144.             }else if(User_NAME == ""){
  145.                 if(data != ""){
  146.                     User_NAME = data;
  147.                 }else{
  148.                     User_NAME = AvatarNAME;
  149.                 }
  150.                 llOwnerSay("アバターの正規名取得 OK : " + User_NAME);
  151.                 QUERY_KEY = llRequestDisplayName(User_UUID);
  152.             }else if(User_DISP == ""){
  153.                 if(data != ""){
  154.                     User_DISP = data;
  155.                 }else{
  156.                     User_DISP = AvatarNAME;
  157.                 }
  158.                 llOwnerSay("アバターの表示名取得 OK : " + User_DISP);
  159.                 state RUN;
  160.             }
  161.         }
  162.     }
  163. }
  164.  
  165. state RUN{//対象のUUIDからオンライン状態チェック
  166.     state_entry(){
  167.         //URLがあれば
  168.         if(WEBHOOK_URL != ""){
  169.             FLG_ONLINE = 999;
  170.             //タイマー開始 (36秒よりも短くしても無駄ですのでやめましょう)
  171.             llSetTimerEvent(36.0);
  172.             llOwnerSay("チェック動作を開始します。");
  173.             llOwnerSay("停止させる場合はスクリプトの実行そのものを停止してください。");
  174.         }else{
  175.             llOwnerSay("スクリプトを編集し、DiscordのHook URL(WEBHOOK_URL)を設定してください。");
  176.         }
  177.     }
  178.  
  179.     timer(){
  180.         QUERY_KEY = llRequestAgentData(User_UUID,DATA_ONLINE);
  181.     }
  182.  
  183.     dataserver(key request_id, string data){
  184.         if(request_id == QUERY_KEY){
  185.             integer nowSTA = (integer)data;
  186.             if(FLG_ONLINE != nowSTA){
  187.                 FLG_ONLINE = nowSTA;
  188.  
  189.                 //アイコンとユーザー名を上書きする
  190.                 list json = [
  191.                     "username", User_DISP + " (" + User_NAME + ")",
  192.                     "content", llList2String(["**now Off Line** :sleeping:","**now On Line** :smiley:"],FLG_ONLINE) +
  193.                     " " + sbGetTimestamp(Time_Offset),
  194.                     "avatar_url", "https://my-secondlife-agni.akamaized.net/users/" + User_NAME + "/thumb_sl_image.png"
  195.                             ];
  196.                 //画像が未登録の場合表示エラーになるけれどWEBHOOKで定義したアイコンになる
  197.  
  198.                 //?wait=は省略時false エラー時の情報取得用など向け。書き込んだ内容が返却される
  199.               //REQUEST_KEY = llHTTPRequest(WEBHOOK_URL + "?wait=true",
  200.                 REQUEST_KEY = llHTTPRequest(WEBHOOK_URL,
  201.                             [
  202.                     HTTP_METHOD, "POST",
  203.                     HTTP_MIMETYPE, "application/json",
  204.                     HTTP_VERIFY_CERT,TRUE,
  205.                     HTTP_VERBOSE_THROTTLE, TRUE,
  206.                     HTTP_PRAGMA_NO_CACHE, TRUE
  207.                             ], llList2Json(JSON_OBJECT, json));
  208.             }
  209.             QUERY_KEY = NULL_KEY;
  210.         }
  211.     }
  212.  
  213.     http_response(key request_id, integer status, list metadata, string body){
  214.         if(REQUEST_KEY == request_id){
  215.             if(status < 200 || status > 206) llOwnerSay("status = " + (string)status + " ;body = " + body);
  216.         }
  217.     }
  218. }
  219.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement