📄 chat.asp
字号:
if (next() == 'r' && next() == 'u' && next() == 'e') {
next();
return true;
}
break;
case 'f':
if (next() == 'a' && next() == 'l' && next() == 's' &&
next() == 'e') {
next();
return false;
}
break;
case 'n':
if (next() == 'u' && next() == 'l' && next() == 'l') {
next();
return null;
}
break;
}
error("Syntax error");
}
function ctor() {
var name = '';
if (ch == '@') {
next();
while (ch == '.' || (ch.toUpperCase() >= 'A' &&
ch.toUpperCase() <= 'Z')) {
name += ch;
next();
}
var arg = val();
if (name in ctors) {
return ctors[name](arg);
} else {
error("Unknown ctor " + name);
}
}
error("Bad ctor");
}
function val() {
white();
switch (ch) {
case '@':
return ctor();
case '{':
return obj();
case '[':
return arr();
case '"':
return str();
case '-':
return num();
default:
return ch >= '0' && ch <= '9' ? num() : word();
}
}
return val();
}
};
var RPC = {
htmlEn: function(ss){
var s=ss;
s = s.replace(/\&/g, '&');
s = s.replace(/\</g, '<');
s = s.replace(/\>/g, '>');
s = s.replace(/\"/g, '"');
return s;
},
getPara: function(s, k){
var a = s.match(new RegExp('([&|\?|#]|\\b)('+ k +'=)([^&]*)([&]|\\b)'));
var ret;
if(a!=null){
ret = decodeURIComponent(a[3]);
}else{ret = '({})';}
return ret;
},
padZeros : function (s, w) {
if(!w){w=2;}
for (var n = w - s.length; n > 0; n--) {
s = '0' + s;
}
return s;
},
timeStamp: function(bL) {
var d = new Date();
var ret = d.getFullYear() + "-" + RPC.padZeros(d.getMonth()) + "-" + RPC.padZeros(d.getDate());
if(bL){
ret += " " + RPC.padZeros(d.getHours()) + ":" + RPC.padZeros(d.getMinutes()) + ":" + RPC.padZeros(d.getSeconds());
}
return ret;
},
iniData : function () {
return { index: 0, data: [] };
},
handler : function (params) {
var d, ret = "";
var action = params.action;
var arg = params.arg;
var index = params.index;
if(!action){action='get'; arg={};}
if(!index){index=-1;}
try{
Application.Lock();
var schat_index = Application("schat_index");
// if get and no data to udpate, ignore it
if( !(action=="get" && index == schat_index) ){
//get global cache data
if(g_appMode){
if(Application('schat_data')){
d = JSON.parse(Application('schat_data'));
}
}else{
d = JSONDB.load(g_curDb);
}
if (!d) {
d = RPC.iniData();
}
//handle action
switch (action) {
case "say": {
var _t=arg.who;
if(!_t || _t==""){
arg.who = g_realip;
}
Application("schat_index") = ++d.index;
d.data.push([
d.index,
RPC.htmlEn(arg.who.substring(0,64)),
g_realip,
RPC.htmlEn(arg.words.substring(0,256)),
RPC.timeStamp(true)
]);
// bake to file
if(d.index % g_count === 0 ){
JSONDB.SaveByDay(d);
}
// keep the count
while(d.data.length > g_count){
d.data.shift();
}
// save global cache data
if(g_appMode){
Application("schat_data")=JSON.stringify(d);
}else{
JSONDB.save(g_curDb, d);
}
}
//RESUME
case "get": {
var i, result = [], entry;
for (i = d.data.length - 1; i >= 0; i--) {
entry = d.data[i];
if(entry[0] <= index){
break;
}
result.unshift(entry);
}
ret = {index: d.index, updates: result};
break;
}
case "hlist":{
ret = JSONDB.getFileList('.');
break;
}
case "history":{
var fn=arg.fn?arg.fn:"";
var db = JSONDB.load(fn);
if (db) {
ret = {index: db.index, updates: db.data};
}
break;
}
}
}
}catch(e){}finally{
Application.UnLock();
}
return ret;
},
exceptionToJson: function (e) {
var result;
if ((typeof e == typeof {}) && ("name" in e) && (e.name == "RPCServerException")) {
result = e;
} else if ((typeof e == typeof {}) && ("message" in e)) {
result = { message: e.message, name: e.name };
} else {
result = { message: e.toString(), name: null };
}
return {toJsonString: function () {
return "@exception " + JSON.stringify(result);
}};
}
};
var JSONDB = {
fs: Server.CreateObject("Scripting.FileSystemObject"),
load: function (relpath) {
var ret, f, path = Server.MapPath(relpath);;
try{
f = JSONDB.fs.OpenTextFile(path, 1);
ret = JSON.parse(f.ReadAll());
}catch(e){
ret = undefined;
}finally{
try{
if(f){
f.Close();
delete f;
}
}catch(e){}
}
return ret;
},
save: function (relpath, data) {
var ret,f,path = Server.MapPath(relpath);
try{
f = JSONDB.fs.CreateTextFile(path);
f.WriteLine(JSON.stringify(data));
ret=true;
}catch(e){
ret=false;
}finally{
try{
if(f){
f.Close();
delete f;
}
}catch(e){}
}
return ret;
},
SaveByDay:function(d){
var pth = g_dbfilePreTag + RPC.timeStamp();
try{
var bak = JSONDB.load(pth);
if(!bak){
bak = RPC.iniData();
}
bak.index = d.index;
var bakD=bak.data, dbD = d.data;
for(var i=0, l=dbD.length; i<l ;i++){
bakD.push(dbD[i]);
}
JSONDB.save(pth, bak);
}catch(e){}
},
getFileList: function (relpath){
var strPath = Server.MapPath(relpath);
var folder = JSONDB.fs.GetFolder(strPath);
var ret = [];
var files = new Enumerator(folder.files);
for(var i=0; !files.atEnd(); files.moveNext()){
if(files.item().Name.indexOf(g_dbfilePreTag)==0){
ret.push([files.item().Name, files.item().Size]);
}
i++;
}
delete files;
delete folder;
return ret;
}
};
%>
<%/*shell code*/%>
<script language="VBScript" runat="server">
Dim g_reqData, g_realip, g_dbfilePreTag, g_curDb, g_count, g_appMode
g_reqData = BinaryToString(Request.BinaryRead(Request.TotalBytes))
g_realip = getIP
g_dbfilePreTag="chat_"
g_curDb="chat"
g_count = 20
g_appMode = false
</script>
<%
try {
var params = JSON.parse(RPC.getPara(g_reqData,"para"));
Response.Write(JSON.stringify(RPC.handler(params)));
}catch(e){
Response.Write(JSON.stringify(RPC.exceptionToJson(e)));
}
%>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -