diff --git a/plugins/redis/index.py b/plugins/redis/index.py
index 62a8686c2..334ab4d19 100755
--- a/plugins/redis/index.py
+++ b/plugins/redis/index.py
@@ -214,7 +214,8 @@ def initdStatus():
if mw.isAppleSystem():
return "Apple Computer does not support"
- shell_cmd = 'systemctl status redis | grep loaded | grep "enabled;"'
+ shell_cmd = 'systemctl status ' + \
+ getPluginName() + ' | grep loaded | grep "enabled;"'
data = mw.execShell(shell_cmd)
if data[0] == '':
return 'fail'
@@ -225,7 +226,7 @@ def initdInstall():
if mw.isAppleSystem():
return "Apple Computer does not support"
- mw.execShell('systemctl enable redis')
+ mw.execShell('systemctl enable ' + getPluginName())
return 'ok'
@@ -233,7 +234,7 @@ def initdUinstall():
if mw.isAppleSystem():
return "Apple Computer does not support"
- mw.execShell('systemctl disable redis')
+ mw.execShell('systemctl disable ' + getPluginName())
return 'ok'
diff --git a/plugins/redis/js/redis.js b/plugins/redis/js/redis.js
index 047328f15..01da0647c 100755
--- a/plugins/redis/js/redis.js
+++ b/plugins/redis/js/redis.js
@@ -1,14 +1,3 @@
-
-function str2Obj(str){
- var data = {};
- kv = str.split('&');
- for(i in kv){
- v = kv[i].split('=');
- data[v[0]] = v[1];
- }
- return data;
-}
-
function redisPost(method, version, args,callback){
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
@@ -18,7 +7,7 @@ function redisPost(method, version, args,callback){
req_data['version'] = version;
if (typeof(args) == 'string'){
- req_data['args'] = JSON.stringify(str2Obj(args));
+ req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
@@ -46,7 +35,7 @@ function redisPostCallbak(method, version, args,callback){
args['version'] = version;
if (typeof(args) == 'string'){
- req_data['args'] = JSON.stringify(str2Obj(args));
+ req_data['args'] = JSON.stringify(toArrayObject(args));
} else {
req_data['args'] = JSON.stringify(args);
}
diff --git a/plugins/tgbot/ico.png b/plugins/tgbot/ico.png
new file mode 100644
index 000000000..9416145b2
Binary files /dev/null and b/plugins/tgbot/ico.png differ
diff --git a/plugins/tgbot/index.html b/plugins/tgbot/index.html
new file mode 100755
index 000000000..fa1873be6
--- /dev/null
+++ b/plugins/tgbot/index.html
@@ -0,0 +1,24 @@
+
+
+
\ No newline at end of file
diff --git a/plugins/tgbot/index.py b/plugins/tgbot/index.py
new file mode 100755
index 000000000..3b76feef2
--- /dev/null
+++ b/plugins/tgbot/index.py
@@ -0,0 +1,239 @@
+# coding:utf-8
+
+import sys
+import io
+import os
+import time
+import re
+import json
+import base64
+
+sys.path.append(os.getcwd() + "/class/core")
+import mw
+
+app_debug = False
+if mw.isAppleSystem():
+ app_debug = True
+
+
+def getPluginName():
+ return 'tgbot'
+
+
+def getPluginDir():
+ return mw.getPluginDir() + '/' + getPluginName()
+
+
+def getServerDir():
+ return mw.getServerDir() + '/' + getPluginName()
+
+
+def getInitDFile():
+ if app_debug:
+ return '/tmp/' + getPluginName()
+ return '/etc/init.d/' + getPluginName()
+
+
+def getConfigData():
+ cfg_path = getServerDir() + "/data.cfg"
+ if not os.path.exists(cfg_path):
+ mw.writeFile(cfg_path, '{}')
+ t = mw.readFile(cfg_path)
+ return json.loads(t)
+
+
+def writeConf(data):
+ cfg_path = getServerDir() + "/data.cfg"
+ mw.writeFile(cfg_path, json.dumps(data))
+ return True
+
+
+def getInitDTpl():
+ path = getPluginDir() + "/init.d/" + getPluginName() + ".tpl"
+ return path
+
+
+def getArgs():
+ args = sys.argv[2:]
+ tmp = {}
+ args_len = len(args)
+ if args_len == 1:
+ t = args[0].strip('{').strip('}')
+ if t.strip() == '':
+ tmp = []
+ else:
+ t = t.split(':')
+ tmp[t[0]] = t[1]
+ tmp[t[0]] = t[1]
+ elif args_len > 1:
+ for i in range(len(args)):
+ t = args[i].split(':')
+ tmp[t[0]] = t[1]
+ return tmp
+
+
+def checkArgs(data, ck=[]):
+ for i in range(len(ck)):
+ if not ck[i] in data:
+ return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
+ return (True, mw.returnJson(True, 'ok'))
+
+
+def status():
+ data = mw.execShell(
+ "ps -ef|grep tgbot |grep -v grep | grep -v mdserver-web | awk '{print $2}'")
+ if data[0] == '':
+ return 'stop'
+ return 'start'
+
+
+def initDreplace():
+
+ file_tpl = getInitDTpl()
+ service_path = mw.getServerDir()
+
+ initD_path = getServerDir() + '/init.d'
+ if not os.path.exists(initD_path):
+ os.mkdir(initD_path)
+ file_bin = initD_path + '/' + getPluginName()
+
+ # initd replace
+ # if not os.path.exists(file_bin):
+ content = mw.readFile(file_tpl)
+ content = content.replace('{$SERVER_PATH}', service_path + '/mdserver-web')
+ content = content.replace(
+ '{$APP_PATH}', service_path + '/' + getPluginName())
+
+ mw.writeFile(file_bin, content)
+ mw.execShell('chmod +x ' + file_bin)
+
+ # systemd
+ systemDir = mw.systemdCfgDir()
+ systemService = systemDir + '/tgbot.service'
+ systemServiceTpl = getPluginDir() + '/init.d/tgbot.service.tpl'
+ if os.path.exists(systemDir) and not os.path.exists(systemService):
+ service_path = mw.getServerDir()
+ se_content = mw.readFile(systemServiceTpl)
+ se_content = se_content.replace('{$SERVER_PATH}', service_path)
+ mw.writeFile(systemService, se_content)
+ mw.execShell('systemctl daemon-reload')
+
+ return file_bin
+
+
+def tbOp(method):
+ file = initDreplace()
+
+ if not mw.isAppleSystem():
+ data = mw.execShell('systemctl ' + method + ' ' + getPluginName())
+ if data[1] == '':
+ return 'ok'
+ return data[1]
+
+ data = mw.execShell(file + ' ' + method)
+ print(data)
+ # if data[1] == '':
+ # return 'ok'
+ return 'ok'
+
+
+def start():
+ return tbOp('start')
+
+
+def stop():
+ return tbOp('stop')
+
+
+def restart():
+ status = tbOp('restart')
+ return status
+
+
+def reload():
+
+ tgbot_tpl = getPluginDir() + '/startup/tgbot.py'
+ tgbot_dst = getServerDir() + '/tgbot.py'
+
+ content = mw.readFile(tgbot_tpl)
+ mw.writeFile(tgbot_dst, content)
+
+ return tbOp('reload')
+
+
+def initdStatus():
+ if mw.isAppleSystem():
+ return "Apple Computer does not support"
+
+ shell_cmd = 'systemctl status ' + \
+ getPluginName() + ' | grep loaded | grep "enabled;"'
+ data = mw.execShell(shell_cmd)
+ if data[0] == '':
+ return 'fail'
+ return 'ok'
+
+
+def initdInstall():
+ if mw.isAppleSystem():
+ return "Apple Computer does not support"
+
+ mw.execShell('systemctl enable ' + getPluginName())
+ return 'ok'
+
+
+def initdUinstall():
+ if mw.isAppleSystem():
+ return "Apple Computer does not support"
+
+ mw.execShell('systemctl disable ' + getPluginName())
+ return 'ok'
+
+
+def getBotConf():
+ data = getConfigData()
+ if 'bot' in data:
+
+ return mw.returnJson(True, 'ok', data['bot'])
+ return mw.returnJson(False, 'ok', {})
+
+
+def setBotConf():
+ args = getArgs()
+ data_args = checkArgs(args, ['app_token'])
+ if not data_args[0]:
+ return data_args[1]
+
+ data = getConfigData()
+ args['app_token'] = base64.b64decode(args['app_token']).decode('ascii')
+ data['bot'] = args
+ writeConf(data)
+
+ return mw.returnJson(True, '保存成功!', [])
+
+
+if __name__ == "__main__":
+ func = sys.argv[1]
+ if func == 'status':
+ print(status())
+ elif func == 'start':
+ print(start())
+ elif func == 'stop':
+ print(stop())
+ elif func == 'restart':
+ print(restart())
+ elif func == 'reload':
+ print(reload())
+ elif func == 'initd_status':
+ print(initdStatus())
+ elif func == 'initd_install':
+ print(initdInstall())
+ elif func == 'initd_uninstall':
+ print(initdUinstall())
+ elif func == 'get_bot_conf':
+ print(getBotConf())
+ elif func == 'set_bot_conf':
+ print(setBotConf())
+ elif func == 'conf':
+ print(getConf())
+ else:
+ print('error')
diff --git a/plugins/tgbot/info.json b/plugins/tgbot/info.json
new file mode 100755
index 000000000..266bbfb6b
--- /dev/null
+++ b/plugins/tgbot/info.json
@@ -0,0 +1,17 @@
+{
+ "sort": 7,
+ "ps": "[DEV]简单Telegram机器人",
+ "name": "tgbot",
+ "title": "tgbot",
+ "shell": "install.sh",
+ "versions":["0.1"],
+ "tip": "soft",
+ "checks": "server/tgbot",
+ "path": "server/tgbot",
+ "display": 1,
+ "author": "Zend",
+ "date": "2023-03-06",
+ "home": "https://core.telegram.org/bots/api",
+ "type": 0,
+ "pid": "5"
+}
\ No newline at end of file
diff --git a/plugins/tgbot/init.d/tgbot.service.tpl b/plugins/tgbot/init.d/tgbot.service.tpl
new file mode 100644
index 000000000..77a48f06c
--- /dev/null
+++ b/plugins/tgbot/init.d/tgbot.service.tpl
@@ -0,0 +1,15 @@
+[Unit]
+Description=Redis In-Memory Data Store
+After=network.target
+
+[Service]
+Type=forking
+ExecStart={$APP_PATH}/init.d/tgbot start
+ExecStop={$APP_PATH}/init.d/tgbot stop
+ExecReload={$APP_PATH}/init.d/tgbot reload
+ExecRestart={$APP_PATH}/init.d/tgbot restart
+KillMode=process
+Restart=on-failure
+
+[Install]
+WantedBy=multi-user.target
\ No newline at end of file
diff --git a/plugins/tgbot/init.d/tgbot.tpl b/plugins/tgbot/init.d/tgbot.tpl
new file mode 100644
index 000000000..a7c2aaea5
--- /dev/null
+++ b/plugins/tgbot/init.d/tgbot.tpl
@@ -0,0 +1,85 @@
+#!/bin/sh
+# chkconfig: 2345 55 25
+# description: Tgbot Service
+
+### BEGIN INIT INFO
+# Provides: Tgbot
+# Required-Start: $all
+# Required-Stop: $all
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: starts Tgbot
+# Description: starts the MDW-Web
+### END INIT INFO
+
+# Simple Tgbot init.d script conceived to work on Linux systems
+# as it does use of the /proc filesystem.
+
+PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export LANG=en_US.UTF-8
+
+
+mw_path={$SERVER_PATH}
+PATH=$PATH:$mw_path/bin
+
+if [ -f $mw_path/bin/activate ];then
+ source $mw_path/bin/activate
+fi
+
+tg_start(){
+
+ isStart=`ps -ef|grep 'tgbot.py' |grep -v grep | awk '{print $2}'`
+ if [ "$isStart" == '' ];then
+ echo -e "starting tgbot... \c"
+ cd $mw_path
+ python3 {$APP_PATH}/tgbot.py >> {$APP_PATH}/task.log &
+ isStart=""
+ while [[ "$isStart" == "" ]];
+ do
+ echo -e ".\c"
+ sleep 0.5
+ isStart=`ps -ef|grep 'tgbot.py' |grep -v grep | awk '{print $2}'`
+ let n+=1
+ if [ $n -gt 20 ];then
+ break;
+ fi
+ done
+ if [ "$isStart" == '' ];then
+ echo -e "\033[31mfailed\033[0m"
+ echo -e "\033[31mError: tgbot service startup failed.\033[0m"
+ return;
+ fi
+ echo -e "\033[32mdone\033[0m"
+ else
+ echo "starting tgbot...(pid $(echo $isStart)) already running"
+ fi
+}
+
+
+tg_stop(){
+ echo -e "stopping tgbot ... \c";
+ arr=`ps aux|grep 'tgbot.py'|grep -v grep|awk '{print $2}'`
+ for p in ${arr[@]}
+ do
+ kill -9 $p > /dev/null 2>&1
+ done
+ echo -e "\033[32mdone\033[0m"
+}
+
+case "$1" in
+ start)
+ tg_start
+ ;;
+ stop)
+ tg_stop
+ ;;
+ restart|reload)
+ tg_stop
+ sleep 0.3
+ tg_start
+ ;;
+ *)
+ echo "Please use start or stop as first argument"
+ ;;
+esac
+
diff --git a/plugins/tgbot/install.sh b/plugins/tgbot/install.sh
new file mode 100755
index 000000000..cec3fab83
--- /dev/null
+++ b/plugins/tgbot/install.sh
@@ -0,0 +1,59 @@
+#!/bin/bash
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export PATH
+
+curPath=`pwd`
+rootPath=$(dirname "$curPath")
+rootPath=$(dirname "$rootPath")
+serverPath=$(dirname "$rootPath")
+
+
+install_tmp=${rootPath}/tmp/mw_install.pl
+
+VERSION=$2
+
+# pip3 install ccxt
+if [ -f ${rootPath}/bin/activate ];then
+ source ${rootPath}/bin/activate
+fi
+
+pip3 install pyTelegramBotAPI
+pip3 install telebot
+
+Install_App()
+{
+ echo '正在安装脚本文件...' > $install_tmp
+ mkdir -p $serverPath/source
+ mkdir -p $serverPath/tgbot
+ echo "${VERSION}" > $serverPath/tgbot/version.pl
+
+ cp -rf ${rootPath}/plugins/tgbot/startup/* $serverPath/tgbot
+
+ cd ${rootPath} && python3 ${rootPath}/plugins/tgbot/index.py start
+ cd ${rootPath} && python3 ${rootPath}/plugins/tgbot/index.py initd_install
+ echo '安装完成' > $install_tmp
+}
+
+Uninstall_App()
+{
+ if [ -f /usr/lib/systemd/system/tgbot.service ];then
+ systemctl stop tgbot
+ systemctl disable tgbot
+ rm -rf /usr/lib/systemd/system/tgbot.service
+ systemctl daemon-reload
+ fi
+
+ if [ -f $serverPath/tgbot/initd/tgbot ];then
+ $serverPath/tgbot/initd/tgbot stop
+ fi
+
+ rm -rf $serverPath/tgbot
+ echo "Uninstall_redis" > $install_tmp
+}
+
+action=$1
+if [ "${1}" == 'install' ];then
+ Install_App
+else
+ Uninstall_App
+fi
diff --git a/plugins/tgbot/js/tgbot.js b/plugins/tgbot/js/tgbot.js
new file mode 100755
index 000000000..04c1643ed
--- /dev/null
+++ b/plugins/tgbot/js/tgbot.js
@@ -0,0 +1,78 @@
+function appPost(method, args,callback){
+ var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
+
+ var req_data = {};
+ req_data['name'] = 'tgbot';
+ req_data['func'] = method;
+
+ if (typeof(args) == 'string'){
+ req_data['args'] = JSON.stringify(toArrayObject(args));
+ } else {
+ req_data['args'] = JSON.stringify(args);
+ }
+
+ $.post('/plugins/run', req_data, function(data) {
+ layer.close(loadT);
+ if(typeof(callback) == 'function'){
+ callback(data);
+ }
+ },'json');
+}
+
+function appPostCallbak(method, args,callback){
+ var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 });
+
+ var req_data = {};
+ req_data['name'] = 'tgbot';
+ req_data['func'] = method;
+
+ if (typeof(args) == 'string'){
+ req_data['args'] = JSON.stringify(toArrayObject(args));
+ } else {
+ req_data['args'] = JSON.stringify(args);
+ }
+
+ $.post('/plugins/callback', req_data, function(data) {
+ layer.close(loadT);
+ if (!data.status){
+ layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']});
+ return;
+ }
+
+ if(typeof(callback) == 'function'){
+ callback(data);
+ }
+ },'json');
+}
+
+function botConf(){
+ appPost('get_bot_conf','',function(data){
+ var rdata = $.parseJSON(data.data);
+ var app_token = 'app_token';
+ if(rdata['status']){
+ db_data = rdata['data'];
+ app_token = db_data['app_token'];
+
+ }
+
+ var mlist = '';
+ mlist += 'app_token必填写
'
+ var option = '\
+ \
+ ' + mlist + '\
+
\
+ \
+
\
+
';
+ $(".soft-man-con").html(option);
+ });
+}
+
+function submitBotConf(){
+ var pull_data = {};
+ pull_data['app_token'] = base64_encode($('input[name="app_token"]').val());
+ appPost('set_bot_conf',pull_data,function(data){
+ var rdata = $.parseJSON(data.data);
+ layer.msg(rdata['msg'],{icon:rdata['status']?1:2,time:2000,shade: [0.3, '#000']});
+ });
+}
diff --git a/plugins/tgbot/startup/tgbot.py b/plugins/tgbot/startup/tgbot.py
new file mode 100644
index 000000000..1851f2213
--- /dev/null
+++ b/plugins/tgbot/startup/tgbot.py
@@ -0,0 +1,63 @@
+
+# coding:utf-8
+
+import sys
+import io
+import os
+import time
+import re
+import json
+import base64
+
+sys.path.append(os.getcwd() + "/class/core")
+import mw
+
+import telebot
+
+
+def getPluginName():
+ return 'tgbot'
+
+
+def getPluginDir():
+ return mw.getPluginDir() + '/' + getPluginName()
+
+
+def getServerDir():
+ return mw.getServerDir() + '/' + getPluginName()
+
+
+def getConfigData():
+ cfg_path = getServerDir() + "/data.cfg"
+ if not os.path.exists(cfg_path):
+ mw.writeFile(cfg_path, '{}')
+ t = mw.readFile(cfg_path)
+ return json.loads(t)
+
+
+def writeConf(data):
+ cfg_path = getServerDir() + "/data.cfg"
+ mw.writeFile(cfg_path, json.dumps(data))
+ return True
+
+# start tgbot
+cfg = getConfigData()
+bot = telebot.TeleBot(cfg['bot']['app_token'])
+
+
+# from telebot.async_telebot import AsyncTeleBot
+# import asyncio
+# bot = AsyncTeleBot(cfg['bot']['app_token'])
+
+
+@bot.message_handler(commands=['start', 'help'])
+def hanle_start_help(message):
+ bot.reply_to(message, "hello world")
+
+
+@bot.message_handler(commands=['chat_id'])
+def hanle_get_chat_id(message):
+ bot.reply_to(message, message.chat.id)
+
+bot.polling()
+# asyncio.run(bot.polling())
diff --git a/route/static/app/public.js b/route/static/app/public.js
index 5f65bcce8..1b83a07c1 100755
--- a/route/static/app/public.js
+++ b/route/static/app/public.js
@@ -1773,6 +1773,159 @@ function entitiesDecode(text) {
return text;
}
+// base64.js
+// base64加密
+function base64_encode(str) {
+ var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ var out, i, len;
+ var c1, c2, c3;
+
+ len = str.length;
+ i = 0;
+ out = "";
+ while(i < len) {
+ c1 = str.charCodeAt(i++) & 0xff;
+ if(i == len)
+ {
+ out += base64EncodeChars.charAt(c1 >> 2);
+ out += base64EncodeChars.charAt((c1 & 0x3) << 4);
+ out += "==";
+ break;
+ }
+ c2 = str.charCodeAt(i++);
+ if(i == len)
+ {
+ out += base64EncodeChars.charAt(c1 >> 2);
+ out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
+ out += base64EncodeChars.charAt((c2 & 0xF) << 2);
+ out += "=";
+ break;
+ }
+ c3 = str.charCodeAt(i++);
+ out += base64EncodeChars.charAt(c1 >> 2);
+ out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
+ out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
+ out += base64EncodeChars.charAt(c3 & 0x3F);
+ }
+ return out;
+}
+
+
+// base64解密
+function base64_decode(str) {
+ var base64DecodeChars = new Array(
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
+ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
+ -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
+ var c1, c2, c3, c4;
+ var i, len, out;
+
+ len = str.length;
+ i = 0;
+ out = "";
+ while(i < len) {
+ /* c1 */
+ do {
+ c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
+ } while(i < len && c1 == -1);
+ if(c1 == -1)
+ break;
+
+ /* c2 */
+ do {
+ c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
+ } while(i < len && c2 == -1);
+ if(c2 == -1)
+ break;
+
+ out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
+
+ /* c3 */
+ do {
+ c3 = str.charCodeAt(i++) & 0xff;
+ if(c3 == 61)
+ return out;
+ c3 = base64DecodeChars[c3];
+ } while(i < len && c3 == -1);
+ if(c3 == -1)
+ break;
+
+ out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
+
+ /* c4 */
+ do {
+ c4 = str.charCodeAt(i++) & 0xff;
+ if(c4 == 61)
+ return out;
+ c4 = base64DecodeChars[c4];
+ } while(i < len && c4 == -1);
+ if(c4 == -1)
+ break;
+ out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
+ }
+ return out;
+}
+
+function utf16to8(str) {
+ var out, i, len, c;
+
+ out = "";
+ len = str.length;
+ for(i = 0; i < len; i++) {
+ c = str.charCodeAt(i);
+ if ((c >= 0x0001) && (c <= 0x007F)) {
+ out += str.charAt(i);
+ } else if (c > 0x07FF) {
+ out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
+ out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
+ out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
+ } else {
+ out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
+ out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
+ }
+ }
+ return out;
+}
+
+function utf8to16(str) {
+ var out, i, len, c;
+ var char2, char3;
+
+ out = "";
+ len = str.length;
+ i = 0;
+ while(i < len) {
+ c = str.charCodeAt(i++);
+ switch(c >> 4)
+ {
+ case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
+ // 0xxxxxxx
+ out += str.charAt(i-1);
+ break;
+ case 12: case 13:
+ // 110x xxxx 10xx xxxx
+ char2 = str.charCodeAt(i++);
+ out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
+ break;
+ case 14:
+ // 1110 xxxx 10xx xxxx 10xx xxxx
+ char2 = str.charCodeAt(i++);
+ char3 = str.charCodeAt(i++);
+ out += String.fromCharCode(((c & 0x0F) << 12) |
+ ((char2 & 0x3F) << 6) |
+ ((char3 & 0x3F) << 0));
+ break;
+ }
+ }
+
+ return out;
+}
+
function pluginService(_name, version){
var data = {name:_name, func:'status'}