koishi-plugin-ets2-tools-tmp 2.3.0 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/evmOpenApi.js +138 -1
- package/lib/api/truckersMpApi.js +133 -1
- package/lib/api/truckersMpMapApi.js +25 -1
- package/lib/api/truckyAppApi.js +48 -1
- package/lib/command/ets-app/queryPoint.js +96 -1
- package/lib/command/ets-app/resetPassword.js +270 -1
- package/lib/command/tmpActivityService.js +603 -1
- package/lib/command/tmpBind.js +19 -1
- package/lib/command/tmpDlcMap.js +33 -1
- package/lib/command/tmpFootprint.js +109 -1
- package/lib/command/tmpMileageRanking.js +55 -1
- package/lib/command/tmpPosition.js +123 -1
- package/lib/command/tmpQuery/tmpQuery.js +12 -1
- package/lib/command/tmpQuery/tmpQueryImg.js +103 -1
- package/lib/command/tmpQuery/tmpQueryText.js +196 -1
- package/lib/command/tmpServer.js +41 -1
- package/lib/command/tmpTraffic/tmpTraffic.js +15 -1
- package/lib/command/tmpTraffic/tmpTrafficMap.js +163 -1
- package/lib/command/tmpTraffic/tmpTrafficText.js +60 -1
- package/lib/command/tmpVersion.js +14 -1
- package/lib/command/tmpVtc.js +29 -1
- package/lib/database/guildBind.js +41 -1
- package/lib/database/model.js +65 -1
- package/lib/database/translateCache.js +31 -1
- package/lib/index.js +332 -1
- package/lib/resource/dlc.html +1 -1
- package/lib/resource/footprint.html +1 -1
- package/lib/resource/package/ets-map.js +63 -1
- package/lib/resource/package/leaflet/heatmap.min.js +9 -1
- package/lib/resource/package/leaflet/leaflet-heatmap.js +246 -1
- package/lib/resource/position.html +1 -1
- package/lib/resource/traffic.html +1 -1
- package/lib/util/baiduTranslate.js +24 -1
- package/lib/util/common.js +5 -1
- package/lib/util/constant.js +36 -1
- package/package.json +1 -1
|
@@ -1 +1,270 @@
|
|
|
1
|
-
const _0x2332c0=_0x48d2;(function(_0x1558a6,_0x4747b7){const _0x56ebdd=_0x48d2,_0x24d36c=_0x1558a6();while(!![]){try{const _0x3e1983=-parseInt(_0x56ebdd(0x17e))/0x1*(parseInt(_0x56ebdd(0x1c6))/0x2)+-parseInt(_0x56ebdd(0x1b5))/0x3*(-parseInt(_0x56ebdd(0x162))/0x4)+parseInt(_0x56ebdd(0x19d))/0x5*(-parseInt(_0x56ebdd(0x1a1))/0x6)+parseInt(_0x56ebdd(0x1d9))/0x7+parseInt(_0x56ebdd(0x1d2))/0x8*(-parseInt(_0x56ebdd(0x160))/0x9)+-parseInt(_0x56ebdd(0x1a7))/0xa*(-parseInt(_0x56ebdd(0x1d7))/0xb)+parseInt(_0x56ebdd(0x17f))/0xc;if(_0x3e1983===_0x4747b7)break;else _0x24d36c['push'](_0x24d36c['shift']());}catch(_0x498c35){_0x24d36c['push'](_0x24d36c['shift']());}}}(_0x325a,0xe207b));const _0x430b9a=(function(){let _0x53eef4=!![];return function(_0x315f4e,_0x39e2c6){const _0x2ef1dd=_0x53eef4?function(){const _0x55c302=_0x48d2;if(_0x39e2c6){const _0x99a737=_0x39e2c6[_0x55c302(0x167)](_0x315f4e,arguments);return _0x39e2c6=null,_0x99a737;}}:function(){};return _0x53eef4=![],_0x2ef1dd;};}()),_0x23c2b2=_0x430b9a(this,function(){const _0xd6c136=_0x48d2;return _0x23c2b2[_0xd6c136(0x15f)]()[_0xd6c136(0x1c0)]('(((.+)+)+)+$')[_0xd6c136(0x15f)]()[_0xd6c136(0x1c9)](_0x23c2b2)[_0xd6c136(0x1c0)](_0xd6c136(0x196));});function _0x48d2(_0x2d11b8,_0x561165){const _0x3b2f9f=_0x325a();return _0x48d2=function(_0x373a50,_0x133e34){_0x373a50=_0x373a50-0x15b;let _0x72ce79=_0x3b2f9f[_0x373a50];return _0x72ce79;},_0x48d2(_0x2d11b8,_0x561165);}_0x23c2b2();const _0x133e34=(function(){let _0x9a80f7=!![];return function(_0x29bc26,_0x4c2ad2){const _0x1862f0=_0x9a80f7?function(){const _0x56c145=_0x48d2;if(_0x4c2ad2){const _0x3258a0=_0x4c2ad2[_0x56c145(0x167)](_0x29bc26,arguments);return _0x4c2ad2=null,_0x3258a0;}}:function(){};return _0x9a80f7=![],_0x1862f0;};}()),_0x373a50=_0x133e34(this,function(){const _0x163a14=_0x48d2;let _0x43ee5d;try{const _0x301e58=Function(_0x163a14(0x171)+_0x163a14(0x1ab)+');');_0x43ee5d=_0x301e58();}catch(_0xcbfb64){_0x43ee5d=window;}const _0xa5b5a=_0x43ee5d['console']=_0x43ee5d[_0x163a14(0x172)]||{},_0x26d9cb=[_0x163a14(0x182),_0x163a14(0x19e),_0x163a14(0x1a2),_0x163a14(0x1b9),_0x163a14(0x16e),_0x163a14(0x15e),_0x163a14(0x193)];for(let _0x25f9b5=0x0;_0x25f9b5<_0x26d9cb[_0x163a14(0x1b0)];_0x25f9b5++){const _0x371cdf=_0x133e34[_0x163a14(0x1c9)][_0x163a14(0x186)][_0x163a14(0x1bd)](_0x133e34),_0x5e18bc=_0x26d9cb[_0x25f9b5],_0x20f993=_0xa5b5a[_0x5e18bc]||_0x371cdf;_0x371cdf[_0x163a14(0x184)]=_0x133e34['bind'](_0x133e34),_0x371cdf[_0x163a14(0x15f)]=_0x20f993[_0x163a14(0x15f)]['bind'](_0x20f993),_0xa5b5a[_0x5e18bc]=_0x371cdf;}});_0x373a50();const {h}=require(_0x2332c0(0x168));function _0x325a(){const _0x45f1a2=['获取成员信息:\x20','[V2]\x20成员邮箱原始值:\x20','statusText','您没有权限重置其他用户的密码,请联系管理员','54WZfUMP','startsWith','user','[V2]\x20使用\x20QQ\x20方式重置密码,rawTarget=','error','[V2]\x20邮件发送详情:\x20mailFromName=','密码重置错误:\x20','[V2]\x20即将重置密码,uid=','bind','请求响应:\x20','获取QQ号错误,请使用车队编号重置','search','http','/api/user/info/list?','[V2]\x20邮件发送成功:\x20由\x20','重置密码请求:\x20','&teamId=','2fdWZOM','),\x20错误:\x20','data','constructor','email','[V2]\x20成员邮箱规范化后:\x20','msg','http://','[V2]\x20邮件发送状态:\x20由\x20',',\x20rawContentLength=','您没有权限重置其他用户的密码,请联系管理员重置,或私聊机器人重置','logger','5032NzpGQh','\x20发送到\x20','floor','exports','includes','11WVNtZj','[V2]\x20使用\x20UID\x20方式重置密码,uid=','4492362smyPNn','\x20密码','teamId','密码重置成功!新密码已发送到您的邮箱,请查收。','未找到您的信息,请联系管理员','\x20发起密码重置','table','toString','11277LbYosD','page','124472NRvnzG','\x20重置车队:\x20','0123456789','未找到','/members/get?qq=','apply','koishi','trim','stringify','仅管理员可使用\x20uid\x20参数重置他人密码','[V2]\x20已开启邮件发送,但未找到用户邮箱或\x20mailTo','mainSettings','exception',',\x20newPassword=','管理员\x20','return\x20(function()\x20','console','toLowerCase','请求错误:\x20','/members/','[V2]\x20邮件发送详情:\x20rawMessage=','未找到用户信息','bots','substring','uid','indexOf','/members/get?uid=','成员信息响应:\x20','167380xXARmA','10083852fJYHxx','\x20的密码重置成功!新密码已发送到用户邮箱。','获取QQ号错误,请使用QQ号重置','log','[V2]\x20未发现可用的\x20mail\x20适配器,无法发送邮件','__proto__',',\x20parsedQQ=','prototype','post','[V2]\x20成员邮箱:\x20','private:','[V2]\x20邮件发送失败:\x20由\x20','<at\x20','您没有权限重置其他成员的密码,请联系管理员','id=\x22','match','list','get','用户\x20','/password','trace','channelId','\x20(channelId=','(((.+)+)+)+$','userId','https://','重置密码响应:\x20',',\x20subject=','mail','replace','959110IqOVsD','warn','random','网络错误:\x20','42itlqEu','info','code','message','response','status','11818790SDuntx','join','获取用户信息:\x20','\x20重置QQ:\x20','{}.constructor(\x22return\x20this\x22)(\x20)','test','[V2]\x20邮件发送详情:\x20messageElement=','请求失败:\x20','未知错误','length'];_0x325a=function(){return _0x45f1a2;};return _0x325a();}module[_0x2332c0(0x1d5)]=async(_0x109a17,_0x4a0edf,_0x2bbd6c,_0x558cf9,_0xe5cb31)=>{const _0x17d8de=_0x2332c0,{url:_0x9f5377,token:_0x3382fa,logOutput:_0x5a4082,platformVersion:_0x1352b6,mailEnabled:_0x5c5871,mailTo:_0x4f540a,mailSubject:_0x595fb1,mailTemplate:_0x1f319c,mailFromName:_0x2e5e57}=_0x4a0edf[_0x17d8de(0x16d)]?.['settings']||{},{adminUsers:_0x4de906}=_0x4a0edf['resetPassword']?.['settings']||{},_0x40d451=_0x2bbd6c[_0x17d8de(0x197)],_0x119240=_0x4de906[_0x17d8de(0x1d6)](_0x40d451),_0x1af2ce=_0x2bbd6c[_0x17d8de(0x194)]==='private:'+_0x40d451,_0xa8b858=(_0x1352b6||'v1')[_0x17d8de(0x173)](),_0x368622=_0x5dd643=>_0x5a4082&&_0x109a17[_0x17d8de(0x1d1)][_0x17d8de(0x1a2)](_0x5dd643),_0x47a48a=(_0x237744,_0x168f7b)=>{const _0x401056=_0x17d8de;if(!_0x237744)return _0x168f7b;if(_0x237744[_0x401056(0x1b6)](_0x401056(0x1cd))||_0x237744[_0x401056(0x1b6)](_0x401056(0x198)))return _0x237744;return _0x401056(0x198)+_0x237744;},_0x4e5bde=_0x5b057b=>{const _0x512a23=_0x17d8de;if(!_0x5b057b?.[_0x512a23(0x1b6)]('<at\x20'))return _0x5b057b;const _0x43278a=_0x5b057b[_0x512a23(0x17b)](_0x512a23(0x18d));if(_0x43278a===-0x1)return'';const _0x5cb87f=_0x5b057b[_0x512a23(0x17b)]('\x22',_0x43278a+0x4);if(_0x5cb87f===-0x1)return'';return _0x5b057b[_0x512a23(0x179)](_0x43278a+0x4,_0x5cb87f);},_0x478184=_0x4825e0=>{const _0x5e0eda=_0x17d8de;if(!_0x4825e0)return'';const _0x358666=_0x4825e0[_0x5e0eda(0x169)](),_0x32930e=_0x358666['match'](/<([^>]+)>/),_0x5a059e=_0x32930e?_0x32930e[0x1]:_0x358666;return _0x5a059e[_0x5e0eda(0x19c)](/[\s\u200B-\u200D\uFEFF]+/g,'');},_0x1661f1=async(_0x3a4ed0,_0x542c36,_0x535575)=>{const _0x10df42=_0x17d8de,_0x3a800a=_0x109a17[_0x10df42(0x178)]['find'](_0x1d1906=>_0x1d1906['platform']==='mail');if(!_0x3a800a)return _0x368622(_0x10df42(0x183)),![];const _0xf2984e=_0x3a4ed0&&_0x3a4ed0[_0x10df42(0x1d6)](':')?_0x3a4ed0:_0x10df42(0x189)+_0x3a4ed0,_0x25dac6=_0x3a800a[_0x10df42(0x1b7)]?.['id']||_0x3a800a['selfId']||_0x10df42(0x19b);_0x368622(_0x10df42(0x1ce)+_0x25dac6+_0x10df42(0x1d3)+_0x3a4ed0+_0x10df42(0x195)+_0xf2984e+_0x10df42(0x19a)+(_0x542c36||'')+')'),_0x368622(_0x10df42(0x1ba)+(_0x2e5e57||'')+_0x10df42(0x1cf)+(_0x535575||'')[_0x10df42(0x1b0)]);try{const _0x5f0d0a=_0x535575||'',_0x3a1dae=h(_0x10df42(0x1a4),{'subject':_0x542c36,'fromName':_0x2e5e57||undefined},_0x5f0d0a);return _0x368622(_0x10df42(0x176)+_0x5f0d0a),_0x368622(_0x10df42(0x1ad)+JSON[_0x10df42(0x16a)](_0x3a1dae)),await _0x3a800a['sendMessage'](_0xf2984e,_0x3a1dae),_0x368622(_0x10df42(0x1c3)+_0x25dac6+_0x10df42(0x1d3)+_0x3a4ed0+_0x10df42(0x195)+_0xf2984e+')'),!![];}catch(_0x35ec95){return _0x368622(_0x10df42(0x18a)+_0x25dac6+_0x10df42(0x1d3)+_0x3a4ed0+_0x10df42(0x195)+_0xf2984e+_0x10df42(0x1c7)+_0x35ec95[_0x10df42(0x1a4)]),![];}},_0x2a7541=_0x4a8573=>_0x4a8573[Math[_0x17d8de(0x1d4)](Math[_0x17d8de(0x19f)]()*_0x4a8573[_0x17d8de(0x1b0)])],_0x1d5ecf=()=>{const _0x49aa8e=_0x17d8de,_0x331eed='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',_0x19b45b=_0x49aa8e(0x164),_0xca3dba=_0x331eed+_0x19b45b,_0x5b157c=[_0x2a7541(_0x331eed),_0x2a7541(_0x19b45b)];for(let _0x599d2d=0x0;_0x599d2d<0x8;_0x599d2d++){_0x5b157c['push'](_0x2a7541(_0xca3dba));}for(let _0x1f782f=_0x5b157c[_0x49aa8e(0x1b0)]-0x1;_0x1f782f>0x0;_0x1f782f--){const _0x226e7e=Math[_0x49aa8e(0x1d4)](Math[_0x49aa8e(0x19f)]()*(_0x1f782f+0x1));[_0x5b157c[_0x1f782f],_0x5b157c[_0x226e7e]]=[_0x5b157c[_0x226e7e],_0x5b157c[_0x1f782f]];}return _0x5b157c[_0x49aa8e(0x1a8)]('');},_0x2bfefe=async _0x12783a=>{const _0x1e0579=_0x17d8de;try{const _0xa9528=await _0x109a17[_0x1e0579(0x1c1)][_0x1e0579(0x187)](_0x12783a);return _0x368622(_0x1e0579(0x1be)+JSON['stringify'](_0xa9528)),_0xa9528;}catch(_0x1bdc7b){_0x368622(_0x1e0579(0x174)+_0x1bdc7b);throw _0x1bdc7b;}},_0x389318=async _0x58dd76=>{const _0x487ca4=_0x17d8de,_0x2d86f4=new URLSearchParams({'token':_0x3382fa,'page':0x0,'limit':0x1,..._0x58dd76})['toString'](),_0x171936=_0x487ca4(0x198)+_0x9f5377+_0x487ca4(0x1c2)+_0x2d86f4;_0x368622(_0x487ca4(0x1a9)+_0x171936);const _0xeebdee=await _0x2bfefe(_0x171936);if(_0xeebdee['code']!==0x0||!_0xeebdee[_0x487ca4(0x161)]?.['list']?.[_0x487ca4(0x1b0)])throw new Error(_0x487ca4(0x177));return _0xeebdee['page'][_0x487ca4(0x18f)][0x0];},_0xbc328f=async _0x404306=>{const _0x3bef1c=_0x17d8de,_0x5b91a3=_0x3bef1c(0x198)+_0x9f5377+'/api/user/info/resetPasswordWithTeamId?token='+_0x3382fa+_0x3bef1c(0x1c5)+_0x404306;_0x368622('重置密码请求:\x20'+_0x5b91a3);const _0x4a6cca=await _0x2bfefe(_0x5b91a3);if(_0x4a6cca[_0x3bef1c(0x1a3)]!==0x0)throw new Error(_0x4a6cca[_0x3bef1c(0x1cc)]||_0x3bef1c(0x1af));return _0x404306;};try{if(_0xa8b858==='v2'){if(!_0x3382fa)return'未配置车队平台V2.0\x20API认证令牌';const _0x574e8c=_0x47a48a(_0x9f5377,'https://open.vtcm.link');if(!_0x119240&&!_0x1af2ce)return _0x17d8de(0x1d0);let _0x139ff0='',_0x40c6ab='',_0x46fd40='';const _0xd78a74=_0x558cf9?_0x558cf9[_0x17d8de(0x169)]():'',_0x463624=_0xd78a74[_0x17d8de(0x18e)](/^uid\s*=\s*(\d+)$/i);if(_0x463624){if(!_0x119240)return _0x17d8de(0x16b);_0x40c6ab=_0x463624[0x1],_0x368622(_0x17d8de(0x1d8)+_0x40c6ab);const _0x29b79e=_0x574e8c+_0x17d8de(0x17c)+encodeURIComponent(_0x40c6ab);_0x368622(_0x17d8de(0x1b1)+_0x29b79e);const _0x126cf1=await _0x109a17[_0x17d8de(0x1c1)]['get'](_0x29b79e,{'headers':{'token':_0x3382fa}});_0x368622('成员信息响应:\x20'+JSON[_0x17d8de(0x16a)](_0x126cf1));if(_0x126cf1[_0x17d8de(0x1a3)]!==0xc8||!_0x126cf1['data']?.[_0x17d8de(0x17a)])return _0x126cf1[_0x17d8de(0x1cc)]||'未找到用户信息';_0x139ff0=_0x126cf1[_0x17d8de(0x1c8)]['qq']||_0x139ff0;const _0x492013=_0x126cf1[_0x17d8de(0x1c8)]['email']||'';_0x368622(_0x17d8de(0x1b2)+_0x492013),_0x46fd40=_0x478184(_0x492013),_0x368622(_0x17d8de(0x1cb)+_0x46fd40);}else{_0x139ff0=_0xd78a74?_0x4e5bde(_0xd78a74):_0x40d451,_0x368622(_0x17d8de(0x1b8)+_0xd78a74+_0x17d8de(0x185)+_0x139ff0);if(!_0x139ff0)return _0x17d8de(0x181);if(!/^\d+$/['test'](_0x139ff0))return'QQ号格式不正确,请输入纯数字QQ号';if(!_0x119240&&_0x139ff0!==_0x40d451)return _0x17d8de(0x18c);const _0x48c54f=_0x574e8c+_0x17d8de(0x166)+encodeURIComponent(_0x139ff0);_0x368622(_0x17d8de(0x1b1)+_0x48c54f);const _0x42910f=await _0x109a17[_0x17d8de(0x1c1)][_0x17d8de(0x190)](_0x48c54f,{'headers':{'token':_0x3382fa}});_0x368622(_0x17d8de(0x17d)+JSON[_0x17d8de(0x16a)](_0x42910f));if(_0x42910f['code']!==0xc8||!_0x42910f[_0x17d8de(0x1c8)]?.['uid'])return _0x42910f['msg']||_0x17d8de(0x177);_0x40c6ab=_0x42910f[_0x17d8de(0x1c8)][_0x17d8de(0x17a)],_0x139ff0=_0x42910f['data']['qq']||_0x139ff0;const _0x4046a3=_0x42910f[_0x17d8de(0x1c8)][_0x17d8de(0x1ca)]||'';_0x368622(_0x17d8de(0x1b2)+_0x4046a3),_0x46fd40=_0x478184(_0x4046a3),_0x368622(_0x17d8de(0x1cb)+_0x46fd40);}_0x46fd40?_0x368622(_0x17d8de(0x188)+_0x46fd40):_0x368622('[V2]\x20成员邮箱为空,可能无法发送到用户邮箱');const _0x310ad7=_0xe5cb31?.[_0x17d8de(0x169)]()||_0x1d5ecf();_0x368622(_0x17d8de(0x1bc)+_0x40c6ab+_0x17d8de(0x16f)+_0x310ad7);const _0x419350=_0x574e8c+_0x17d8de(0x175)+_0x40c6ab+_0x17d8de(0x192);_0x368622(_0x17d8de(0x1c4)+_0x419350);const _0xed2e42=await _0x109a17[_0x17d8de(0x1c1)][_0x17d8de(0x187)](_0x419350,{'password':_0x310ad7},{'headers':{'token':_0x3382fa}});_0x368622(_0x17d8de(0x199)+JSON[_0x17d8de(0x16a)](_0xed2e42));if(_0xed2e42[_0x17d8de(0x1a3)]!==0xc8)return _0xed2e42[_0x17d8de(0x1cc)]||_0x17d8de(0x1af);const _0x3cd552=_0x478184(_0x46fd40||_0x4f540a);if(_0x5c5871&&_0x3cd552){const _0x35cf78=_0x1f319c||'车队平台重置密码成功,uid={uid},qq={qq},新密码:{password}',_0x446c1a=_0x35cf78[_0x17d8de(0x19c)](/{uid}/g,_0x40c6ab||'')[_0x17d8de(0x19c)](/{qq}/g,_0x139ff0||'')[_0x17d8de(0x19c)](/{password}/g,_0x310ad7)[_0x17d8de(0x19c)](/{psw}/g,_0x310ad7),_0x43df84=_0x595fb1||'重置密码通知';await _0x1661f1(_0x3cd552,_0x43df84,_0x446c1a);}else _0x5c5871&&_0x368622(_0x17d8de(0x16c));const _0x53abac=_0x119240&&(_0x139ff0||_0x40c6ab);return _0x53abac?'管理员操作:车队编号\x20'+_0x40c6ab+_0x17d8de(0x180):_0x17d8de(0x15b);}let _0xa0df3,_0x49f042;if(_0x558cf9?.[_0x17d8de(0x1b6)](_0x17d8de(0x18b))){if(!_0x119240)return _0x17d8de(0x1b4);const _0x2128ab=_0x558cf9[_0x17d8de(0x17b)](_0x17d8de(0x18d));if(_0x2128ab===-0x1)return _0x17d8de(0x1bf);_0x49f042=_0x558cf9[_0x17d8de(0x179)](_0x2128ab+0x4,_0x558cf9['indexOf']('\x22',_0x2128ab+0x4));if(!/^\d+$/[_0x17d8de(0x1ac)](_0x49f042))return _0x17d8de(0x1bf);_0x368622(_0x17d8de(0x170)+_0x40d451+_0x17d8de(0x1aa)+_0x49f042+_0x17d8de(0x1da));const _0x27179f=await _0x389318({'qq':_0x49f042});_0xa0df3=_0x27179f[_0x17d8de(0x1db)];}else{if(_0x1af2ce){if(!_0x558cf9){_0x368622(_0x17d8de(0x191)+_0x40d451+_0x17d8de(0x15d));const _0x441ddd=await _0x389318({'qq':_0x40d451});_0xa0df3=_0x441ddd[_0x17d8de(0x1db)];if(!_0xa0df3)return _0x17d8de(0x15c);}else{const _0x8f348a=await _0x389318({'teamId':_0x558cf9});if(!_0x119240&&_0x8f348a['qq']!==_0x40d451)return _0x17d8de(0x18c);_0xa0df3=_0x558cf9;}}else{if(!_0x119240)return _0x17d8de(0x1d0);_0xa0df3=_0x558cf9,_0x368622('管理员\x20'+_0x40d451+_0x17d8de(0x163)+_0xa0df3+'\x20密码'),await _0x389318({'teamId':_0xa0df3});}}const _0x127ff4=await _0xbc328f(_0xa0df3),_0x273833=_0x119240&&(_0x558cf9||_0x49f042);return _0x273833?'管理员操作:车队编号\x20'+_0x127ff4+_0x17d8de(0x180):'密码重置成功!新密码已发送到您的邮箱,请查收。';}catch(_0x339669){_0x109a17['logger'][_0x17d8de(0x1b9)](_0x17d8de(0x1bb)+_0x339669[_0x17d8de(0x1a4)]);if(_0x339669[_0x17d8de(0x1a5)])return _0x17d8de(0x1ae)+_0x339669[_0x17d8de(0x1a5)][_0x17d8de(0x1a6)]+'\x20'+_0x339669[_0x17d8de(0x1a5)][_0x17d8de(0x1b3)];else return _0x339669[_0x17d8de(0x1a3)]?_0x17d8de(0x1a0)+_0x339669[_0x17d8de(0x1a3)]:_0x339669[_0x17d8de(0x1a4)][_0x17d8de(0x1d6)](_0x17d8de(0x165))?_0x339669[_0x17d8de(0x1a4)]:'系统错误,请稍后重试';}};
|
|
1
|
+
const { h } = require("koishi");
|
|
2
|
+
|
|
3
|
+
module.exports = async (ctx, cfg, session, targetTeamId, password) => {
|
|
4
|
+
const { url, token, logOutput, platformVersion, mailEnabled, mailTo, mailSubject, mailTemplate, mailFromName } = cfg.mainSettings?.settings || {};
|
|
5
|
+
const { adminUsers } = cfg.resetPassword?.settings || {};
|
|
6
|
+
const currentUserQQ = session.userId;
|
|
7
|
+
const isAdmin = adminUsers.includes(currentUserQQ);
|
|
8
|
+
const isPrivateChat = session.channelId === `private:${currentUserQQ}`;
|
|
9
|
+
const platform = (platformVersion || "v1").toLowerCase();
|
|
10
|
+
|
|
11
|
+
// 日志工具函数
|
|
12
|
+
const log = (msg) => logOutput && ctx.logger.info(msg);
|
|
13
|
+
|
|
14
|
+
const normalizeBaseUrl = (baseUrl, fallback) => {
|
|
15
|
+
if (!baseUrl) return fallback;
|
|
16
|
+
if (baseUrl.startsWith("http://") || baseUrl.startsWith("https://")) return baseUrl;
|
|
17
|
+
return `https://${baseUrl}`;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const parseAtQQ = (raw) => {
|
|
21
|
+
if (!raw?.startsWith("<at ")) return raw;
|
|
22
|
+
const idStart = raw.indexOf('id="');
|
|
23
|
+
if (idStart === -1) return "";
|
|
24
|
+
const idEnd = raw.indexOf('"', idStart + 4);
|
|
25
|
+
if (idEnd === -1) return "";
|
|
26
|
+
return raw.substring(idStart + 4, idEnd);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const normalizeEmail = (value) => {
|
|
30
|
+
if (!value) return "";
|
|
31
|
+
const trimmed = value.trim();
|
|
32
|
+
const bracketMatch = trimmed.match(/<([^>]+)>/);
|
|
33
|
+
const raw = bracketMatch ? bracketMatch[1] : trimmed;
|
|
34
|
+
return raw.replace(/[\s\u200B-\u200D\uFEFF]+/g, "");
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const sendMail = async (targetMail, subject, content) => {
|
|
38
|
+
const mailBot = ctx.bots.find((bot) => bot.platform === "mail");
|
|
39
|
+
if (!mailBot) {
|
|
40
|
+
log("[V2] 未发现可用的 mail 适配器,无法发送邮件");
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const normalizedTarget = targetMail && targetMail.includes(":")
|
|
44
|
+
? targetMail
|
|
45
|
+
: `private:${targetMail}`;
|
|
46
|
+
const fromAddress = mailBot.user?.id || mailBot.selfId || "mail";
|
|
47
|
+
log(`[V2] 邮件发送状态: 由 ${fromAddress} 发送到 ${targetMail} (channelId=${normalizedTarget}, subject=${subject || ""})`);
|
|
48
|
+
log(`[V2] 邮件发送详情: mailFromName=${mailFromName || ""}, rawContentLength=${(content || "").length}`);
|
|
49
|
+
try {
|
|
50
|
+
const rawMessage = content || "";
|
|
51
|
+
const message = h("message", { subject, fromName: mailFromName || undefined }, rawMessage);
|
|
52
|
+
log(`[V2] 邮件发送详情: rawMessage=${rawMessage}`);
|
|
53
|
+
log(`[V2] 邮件发送详情: messageElement=${JSON.stringify(message)}`);
|
|
54
|
+
await mailBot.sendMessage(normalizedTarget, message);
|
|
55
|
+
log(`[V2] 邮件发送成功: 由 ${fromAddress} 发送到 ${targetMail} (channelId=${normalizedTarget})`);
|
|
56
|
+
return true;
|
|
57
|
+
} catch (error) {
|
|
58
|
+
log(`[V2] 邮件发送失败: 由 ${fromAddress} 发送到 ${targetMail} (channelId=${normalizedTarget}), 错误: ${error.message}`);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const randomChar = (chars) => chars[Math.floor(Math.random() * chars.length)];
|
|
64
|
+
const generatePassword = () => {
|
|
65
|
+
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
66
|
+
const digits = "0123456789";
|
|
67
|
+
const all = letters + digits;
|
|
68
|
+
const chars = [randomChar(letters), randomChar(digits)];
|
|
69
|
+
for (let i = 0; i < 8; i++) {
|
|
70
|
+
chars.push(randomChar(all));
|
|
71
|
+
}
|
|
72
|
+
for (let i = chars.length - 1; i > 0; i--) {
|
|
73
|
+
const j = Math.floor(Math.random() * (i + 1));
|
|
74
|
+
[chars[i], chars[j]] = [chars[j], chars[i]];
|
|
75
|
+
}
|
|
76
|
+
return chars.join("");
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// 通用HTTP请求函数
|
|
80
|
+
const fetchData = async (apiUrl) => {
|
|
81
|
+
try {
|
|
82
|
+
const response = await ctx.http.post(apiUrl);
|
|
83
|
+
log(`请求响应: ${JSON.stringify(response)}`);
|
|
84
|
+
return response;
|
|
85
|
+
} catch (error) {
|
|
86
|
+
log(`请求错误: ${error}`);
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// 获取用户信息
|
|
92
|
+
const getUserInfo = async (params) => {
|
|
93
|
+
const query = new URLSearchParams({ token, page: 0, limit: 1, ...params }).toString();
|
|
94
|
+
const userInfoUrl = `https://${url}/api/user/info/list?${query}`;
|
|
95
|
+
log(`获取用户信息: ${userInfoUrl}`);
|
|
96
|
+
const response = await fetchData(userInfoUrl);
|
|
97
|
+
|
|
98
|
+
if (response.code !== 0 || !response.page?.list?.length) {
|
|
99
|
+
throw new Error(`未找到用户信息`);
|
|
100
|
+
}
|
|
101
|
+
return response.page.list[0];
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// 重置密码
|
|
105
|
+
const resetPassword = async (teamId) => {
|
|
106
|
+
const resetUrl = `https://${url}/api/user/info/resetPasswordWithTeamId?token=${token}&teamId=${teamId}`;
|
|
107
|
+
log(`重置密码请求: ${resetUrl}`);
|
|
108
|
+
const response = await fetchData(resetUrl);
|
|
109
|
+
|
|
110
|
+
if (response.code !== 0) {
|
|
111
|
+
throw new Error(response.msg || "未知错误");
|
|
112
|
+
}
|
|
113
|
+
return teamId;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
if (platform === "v2") {
|
|
118
|
+
if (!token) return "未配置车队平台V2.0 API认证令牌";
|
|
119
|
+
const baseUrl = normalizeBaseUrl(url, "https://open.vtcm.link");
|
|
120
|
+
|
|
121
|
+
if (!isAdmin && !isPrivateChat) {
|
|
122
|
+
return "您没有权限重置其他用户的密码,请联系管理员重置,或私聊机器人重置";
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
let targetQQ = "";
|
|
126
|
+
let memberUid = "";
|
|
127
|
+
let userEmail = "";
|
|
128
|
+
const rawTarget = targetTeamId ? targetTeamId.trim() : "";
|
|
129
|
+
const uidMatch = rawTarget.match(/^uid\s*=\s*(\d+)$/i);
|
|
130
|
+
|
|
131
|
+
if (uidMatch) {
|
|
132
|
+
if (!isAdmin) return "仅管理员可使用 uid 参数重置他人密码";
|
|
133
|
+
memberUid = uidMatch[1];
|
|
134
|
+
log(`[V2] 使用 UID 方式重置密码,uid=${memberUid}`);
|
|
135
|
+
const memberUrl = `${baseUrl}/members/get?uid=${encodeURIComponent(memberUid)}`;
|
|
136
|
+
log(`获取成员信息: ${memberUrl}`);
|
|
137
|
+
const memberResponse = await ctx.http.get(memberUrl, { headers: { token } });
|
|
138
|
+
log(`成员信息响应: ${JSON.stringify(memberResponse)}`);
|
|
139
|
+
if (memberResponse.code !== 200 || !memberResponse.data?.uid) {
|
|
140
|
+
return memberResponse.msg || "未找到用户信息";
|
|
141
|
+
}
|
|
142
|
+
targetQQ = memberResponse.data.qq || targetQQ;
|
|
143
|
+
const rawEmail = memberResponse.data.email || "";
|
|
144
|
+
log(`[V2] 成员邮箱原始值: ${rawEmail}`);
|
|
145
|
+
userEmail = normalizeEmail(rawEmail);
|
|
146
|
+
log(`[V2] 成员邮箱规范化后: ${userEmail}`);
|
|
147
|
+
} else {
|
|
148
|
+
targetQQ = rawTarget ? parseAtQQ(rawTarget) : currentUserQQ;
|
|
149
|
+
log(`[V2] 使用 QQ 方式重置密码,rawTarget=${rawTarget}, parsedQQ=${targetQQ}`);
|
|
150
|
+
if (!targetQQ) return "获取QQ号错误,请使用QQ号重置";
|
|
151
|
+
if (!/^\d+$/.test(targetQQ)) return "QQ号格式不正确,请输入纯数字QQ号";
|
|
152
|
+
if (!isAdmin && targetQQ !== currentUserQQ) {
|
|
153
|
+
return "您没有权限重置其他成员的密码,请联系管理员";
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const memberUrl = `${baseUrl}/members/get?qq=${encodeURIComponent(targetQQ)}`;
|
|
157
|
+
log(`获取成员信息: ${memberUrl}`);
|
|
158
|
+
const memberResponse = await ctx.http.get(memberUrl, { headers: { token } });
|
|
159
|
+
log(`成员信息响应: ${JSON.stringify(memberResponse)}`);
|
|
160
|
+
|
|
161
|
+
if (memberResponse.code !== 200 || !memberResponse.data?.uid) {
|
|
162
|
+
return memberResponse.msg || "未找到用户信息";
|
|
163
|
+
}
|
|
164
|
+
memberUid = memberResponse.data.uid;
|
|
165
|
+
targetQQ = memberResponse.data.qq || targetQQ;
|
|
166
|
+
const rawEmail = memberResponse.data.email || "";
|
|
167
|
+
log(`[V2] 成员邮箱原始值: ${rawEmail}`);
|
|
168
|
+
userEmail = normalizeEmail(rawEmail);
|
|
169
|
+
log(`[V2] 成员邮箱规范化后: ${userEmail}`);
|
|
170
|
+
}
|
|
171
|
+
if (userEmail) {
|
|
172
|
+
log(`[V2] 成员邮箱: ${userEmail}`);
|
|
173
|
+
} else {
|
|
174
|
+
log("[V2] 成员邮箱为空,可能无法发送到用户邮箱");
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const newPassword = password?.trim() || generatePassword();
|
|
178
|
+
log(`[V2] 即将重置密码,uid=${memberUid}, newPassword=${newPassword}`);
|
|
179
|
+
const resetUrl = `${baseUrl}/members/${memberUid}/password`;
|
|
180
|
+
log(`重置密码请求: ${resetUrl}`);
|
|
181
|
+
const resetResponse = await ctx.http.post(resetUrl, { password: newPassword }, { headers: { token } });
|
|
182
|
+
log(`重置密码响应: ${JSON.stringify(resetResponse)}`);
|
|
183
|
+
|
|
184
|
+
if (resetResponse.code !== 200) {
|
|
185
|
+
return resetResponse.msg || "未知错误";
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const effectiveMailTo = normalizeEmail(userEmail || mailTo);
|
|
189
|
+
if (mailEnabled && effectiveMailTo) {
|
|
190
|
+
const template = mailTemplate || "车队平台重置密码成功,uid={uid},qq={qq},新密码:{password}";
|
|
191
|
+
const body = template
|
|
192
|
+
.replace(/{uid}/g, memberUid || "")
|
|
193
|
+
.replace(/{qq}/g, targetQQ || "")
|
|
194
|
+
.replace(/{password}/g, newPassword)
|
|
195
|
+
.replace(/{psw}/g, newPassword);
|
|
196
|
+
const subject = mailSubject || "重置密码通知";
|
|
197
|
+
await sendMail(effectiveMailTo, subject, body);
|
|
198
|
+
} else if (mailEnabled) {
|
|
199
|
+
log("[V2] 已开启邮件发送,但未找到用户邮箱或 mailTo");
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const isAdminOp = isAdmin && (targetQQ || memberUid);
|
|
203
|
+
return isAdminOp
|
|
204
|
+
? `管理员操作:车队编号 ${memberUid} 的密码重置成功!新密码已发送到用户邮箱。`
|
|
205
|
+
: "密码重置成功!新密码已发送到您的邮箱,请查收。";
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
let teamId, targetQQ;
|
|
209
|
+
|
|
210
|
+
// 处理@提及的QQ号
|
|
211
|
+
if (targetTeamId?.startsWith("<at ")) {
|
|
212
|
+
if (!isAdmin) return "您没有权限重置其他用户的密码,请联系管理员";
|
|
213
|
+
|
|
214
|
+
// 提取QQ号
|
|
215
|
+
const idStart = targetTeamId.indexOf('id="');
|
|
216
|
+
if (idStart === -1) return "获取QQ号错误,请使用车队编号重置";
|
|
217
|
+
|
|
218
|
+
targetQQ = targetTeamId.substring(idStart + 4, targetTeamId.indexOf('"', idStart + 4));
|
|
219
|
+
if (!/^\d+$/.test(targetQQ)) return "获取QQ号错误,请使用车队编号重置";
|
|
220
|
+
|
|
221
|
+
log(`管理员 ${currentUserQQ} 重置QQ: ${targetQQ} 密码`);
|
|
222
|
+
const userInfo = await getUserInfo({ qq: targetQQ });
|
|
223
|
+
teamId = userInfo.teamId;
|
|
224
|
+
}
|
|
225
|
+
// 处理车队编号或私聊场景
|
|
226
|
+
else {
|
|
227
|
+
if (isPrivateChat) {
|
|
228
|
+
// 私聊场景
|
|
229
|
+
if (!targetTeamId) {
|
|
230
|
+
// 无目标编号时用当前用户QQ查询
|
|
231
|
+
log(`用户 ${currentUserQQ} 发起密码重置`);
|
|
232
|
+
const userInfo = await getUserInfo({ qq: currentUserQQ });
|
|
233
|
+
teamId = userInfo.teamId;
|
|
234
|
+
if (!teamId) return "未找到您的信息,请联系管理员";
|
|
235
|
+
} else {
|
|
236
|
+
// 有目标编号时验证权限
|
|
237
|
+
const userInfo = await getUserInfo({ teamId: targetTeamId });
|
|
238
|
+
if (!isAdmin && userInfo.qq !== currentUserQQ) {
|
|
239
|
+
return "您没有权限重置其他成员的密码,请联系管理员";
|
|
240
|
+
}
|
|
241
|
+
teamId = targetTeamId;
|
|
242
|
+
}
|
|
243
|
+
} else {
|
|
244
|
+
// 非私聊场景(仅管理员可操作)
|
|
245
|
+
if (!isAdmin) return "您没有权限重置其他用户的密码,请联系管理员重置,或私聊机器人重置";
|
|
246
|
+
|
|
247
|
+
teamId = targetTeamId;
|
|
248
|
+
log(`管理员 ${currentUserQQ} 重置车队: ${teamId} 密码`);
|
|
249
|
+
await getUserInfo({ teamId }); // 验证车队存在性
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// 执行密码重置
|
|
254
|
+
const resetTeamId = await resetPassword(teamId);
|
|
255
|
+
const isAdminOp = isAdmin && (targetTeamId || targetQQ);
|
|
256
|
+
return isAdminOp
|
|
257
|
+
? `管理员操作:车队编号 ${resetTeamId} 的密码重置成功!新密码已发送到用户邮箱。`
|
|
258
|
+
: "密码重置成功!新密码已发送到您的邮箱,请查收。";
|
|
259
|
+
|
|
260
|
+
} catch (error) {
|
|
261
|
+
ctx.logger.error(`密码重置错误: ${error.message}`);
|
|
262
|
+
if (error.response) {
|
|
263
|
+
return `请求失败: ${error.response.status} ${error.response.statusText}`;
|
|
264
|
+
} else if (error.code) {
|
|
265
|
+
return `网络错误: ${error.code}`;
|
|
266
|
+
} else {
|
|
267
|
+
return error.message.includes("未找到") ? error.message : "系统错误,请稍后重试";
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
};
|