mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 16:58:06 +08:00
opt bash
This commit is contained in:
parent
d81a08d4ae
commit
65c8ff8de6
@ -97,12 +97,12 @@ Volcanos("misc", {Message: function(event, can) { var msg = {}
|
|||||||
if (meta[cmds[0]]) { return meta[cmds[0]](cmds.slice(1)), true }
|
if (meta[cmds[0]]) { return meta[cmds[0]](cmds.slice(1)), true }
|
||||||
},
|
},
|
||||||
Run: function(event, can, dataset, cmds, cb) { var msg = can.request(event)
|
Run: function(event, can, dataset, cmds, cb) { var msg = can.request(event)
|
||||||
var form = {cmds: cmds||msg.cmd}; msg.option && msg.option.forEach(function(item) {
|
var form = {}; msg.option && msg.option.forEach(function(item) {
|
||||||
if ([ice.MSG_HANDLE, ice.MSG_DAEMON].indexOf(item) > -1) { return }
|
if ([ice.MSG_HANDLE, ice.MSG_DAEMON].indexOf(item) > -1) { return }
|
||||||
if (can.base.isObject(msg.Option(item))) { return }
|
if (can.base.isObject(msg.Option(item))) { return }
|
||||||
if (can.base.isFunc(msg.Option(item))) { return }
|
if (can.base.isFunc(msg.Option(item))) { return }
|
||||||
msg[item] && (form[item] = msg[item])
|
msg[item] && (form[item] = msg[item])
|
||||||
})
|
}), form.cmds = cmds||form.cmds
|
||||||
can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(),
|
can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(),
|
||||||
"_name", (msg._can.sup||msg._can)._name, "_index", (msg._can.sup||msg._can)._index, ice.MSG_DAEMON, msg.__daemon||dataset.daemon||""
|
"_name", (msg._can.sup||msg._can)._name, "_index", (msg._can.sup||msg._can)._index, ice.MSG_DAEMON, msg.__daemon||dataset.daemon||""
|
||||||
), form, cb)
|
), form, cb)
|
||||||
|
@ -140,7 +140,7 @@ Volcanos("page", {ClassList: {
|
|||||||
case mdb.PAGE:
|
case mdb.PAGE:
|
||||||
_list.push({type: html.TEXT, name: mdb.LIMIT, value: can._msg.Option(mdb.LIMIT)})
|
_list.push({type: html.TEXT, name: mdb.LIMIT, value: can._msg.Option(mdb.LIMIT)})
|
||||||
_list.push({type: html.TEXT, name: mdb.OFFEND, value: can._msg.Option(mdb.OFFEND)})
|
_list.push({type: html.TEXT, name: mdb.OFFEND, value: can._msg.Option(mdb.OFFEND)})
|
||||||
_list.push(mdb.PREV, mdb.NEXT)
|
_list.push(mdb.NEXT, mdb.PREV)
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
(function() { var item = can.core.SplitInput(list[i], html.BUTTON);
|
(function() { var item = can.core.SplitInput(list[i], html.BUTTON);
|
||||||
|
@ -60,6 +60,10 @@ Volcanos("user", {info: {}, agent: {
|
|||||||
web.CLEAR, "清空", web.REFRESH, "刷新", web.SUBMIT, "提交", web.CANCEL, "取消", web.UPLOAD, "上传", web.DOWNLOAD, "下载", web.TOIMAGE, "截图", web.SHARE, "共享",
|
web.CLEAR, "清空", web.REFRESH, "刷新", web.SUBMIT, "提交", web.CANCEL, "取消", web.UPLOAD, "上传", web.DOWNLOAD, "下载", web.TOIMAGE, "截图", web.SHARE, "共享",
|
||||||
"Close", "关闭", "Close others", "关闭其它", "Close all", "关闭所有",
|
"Close", "关闭", "Close others", "关闭其它", "Close all", "关闭所有",
|
||||||
chat.IFRAME, "浏览", chat.LOCATION, "地图",
|
chat.IFRAME, "浏览", chat.LOCATION, "地图",
|
||||||
|
nfs.SAVE, "保存", nfs.LOAD, "加载",
|
||||||
|
cli.ORDER, "加载",
|
||||||
|
aaa.INVITE, "邀请",
|
||||||
|
cli.SYSTEM, "命令",
|
||||||
"revert", "恢复",
|
"revert", "恢复",
|
||||||
"full", "全屏",
|
"full", "全屏",
|
||||||
)[text]||text
|
)[text]||text
|
||||||
|
@ -47,7 +47,8 @@ div.output div.project div.list { margin-left:10px; }
|
|||||||
div.output div.project div.switch { transform: rotate(90deg) translate(1px, 0px); width:12px; float:left; }
|
div.output div.project div.switch { transform: rotate(90deg) translate(1px, 0px); width:12px; float:left; }
|
||||||
div.output div.project div.switch.open { transform: rotate(180deg) translate(-4px, 4px); }
|
div.output div.project div.switch.open { transform: rotate(180deg) translate(-4px, 4px); }
|
||||||
div.output div.project div.zone>div.name { background-color:steelblue; color:white; text-align:center; padding:3px; clear:both; }
|
div.output div.project div.zone>div.name { background-color:steelblue; color:white; text-align:center; padding:3px; clear:both; }
|
||||||
div.output div.project div.zone>div.list>div.zone>div.name { padding-left:20px; text-align:left; }
|
div.output div.project div.zone>div.list>div.zone>div.name { background-color:#09466fc2; padding-left:20px; text-align:left; }
|
||||||
|
div.output div.project div.zone>div.list>div.zone>div.name:hover { background-color:#3c7da8d9; }
|
||||||
div.output div.project div.item>div.name { padding-left:20px; }
|
div.output div.project div.item>div.name { padding-left:20px; }
|
||||||
div.output div.project div.zone>div.action>div.item { padding:0; margin:0; float:right; clear:none; }
|
div.output div.project div.zone>div.action>div.item { padding:0; margin:0; float:right; clear:none; }
|
||||||
div.output div.project div.zone>div.action>div.item input[type=text] { background-color:#ff000000; padding-left:10px; color:white; }
|
div.output div.project div.zone>div.action>div.item input[type=text] { background-color:#ff000000; padding-left:10px; color:white; }
|
||||||
@ -186,6 +187,7 @@ body.white fieldset.panel.Action div.action { color:white; }
|
|||||||
body.white fieldset.plugin { background-color:#ffffffa1; }
|
body.white fieldset.plugin { background-color:#ffffffa1; }
|
||||||
body.white fieldset.float { background-color:#0e3369; color:white; }
|
body.white fieldset.float { background-color:#0e3369; color:white; }
|
||||||
body.white fieldset.full { background-color:#0e3369; color:white; }
|
body.white fieldset.full { background-color:#0e3369; color:white; }
|
||||||
|
body.white div.output div.project div.zone>div.list>div.zone>div.name { background-color:#09466f66; color:black; }
|
||||||
|
|
||||||
/* white hover */
|
/* white hover */
|
||||||
body.white legend:hover { background-color:skyblue; }
|
body.white legend:hover { background-color:skyblue; }
|
||||||
|
@ -9,19 +9,16 @@ Volcanos(chat.ONIMPORT, {
|
|||||||
},
|
},
|
||||||
|
|
||||||
tabInputs: function(event, can, ps, key, pre, cb, parent) {
|
tabInputs: function(event, can, ps, key, pre, cb, parent) {
|
||||||
|
var core = ["usr/icebergs/core/", "usr/volcanos/plugin/local/"]
|
||||||
can.runAction(event, mdb.INPUTS, [key, pre], function(msg) { var _trans = {}
|
can.runAction(event, mdb.INPUTS, [key, pre], function(msg) { var _trans = {}
|
||||||
var carte = can.user[parent? "carteRight": "carte"](event, can, {}, msg.Table(function(value) { var p = can.base.trimPrefix(value[key], pre)
|
var carte = can.user[parent? "carteRight": "carte"](event, can, {}, msg.Table(function(value) { var p = can.base.trimPrefix(value[key], pre)
|
||||||
if (can.base.beginWith(pre, "usr/icebergs/core/") && can.base.beginWith(value[key], "usr/volcanos/plugin/local/")) {
|
if (can.base.beginWith(pre, core[0]) && can.base.beginWith(value[key], core[1])) { var p = can.base.trimPrefix(can.base.replaceAll(value[key], core[1], core[0]), pre) }
|
||||||
var p = can.base.trimPrefix(can.base.replaceAll(value[key], "usr/volcanos/plugin/local/", "usr/icebergs/core/"), pre)
|
if (can.base.beginWith(pre, core[1]) && can.base.beginWith(value[key], core[0])) { var p = can.base.trimPrefix(can.base.replaceAll(value[key], core[0], core[1]), pre) }
|
||||||
}
|
|
||||||
if (can.base.beginWith(pre, "usr/volcanos/plugin/local/") && can.base.beginWith(value[key], "usr/icebergs/core/")) {
|
|
||||||
var p = can.base.trimPrefix(can.base.replaceAll(value[key], "usr/icebergs/core/", "usr/volcanos/plugin/local/"), pre)
|
|
||||||
}
|
|
||||||
return _trans[p] = value[key], p
|
return _trans[p] = value[key], p
|
||||||
}), function(event, button) {
|
}), function(event, button) {
|
||||||
can.base.endWith(button, ps)? can.onimport.tabInputs(event, can, ps, key, pre+button, cb, carte): cb(can.core.Split(_trans[button], ps), pre)
|
can.base.endWith(button, ps)? can.onimport.tabInputs(event, can, ps, key, pre+button, cb, carte): cb(can.core.Split(_trans[button], ps), pre)
|
||||||
}, parent)._target, _p = can.core.Split(event.target.innerHTML.trim(), ice.PT)[0]
|
}, parent)._target, _p = can.core.Split(event.target.innerHTML.trim(), ice.PT)[0]
|
||||||
can.page.Select(can, carte, html.DIV_ITEM, function(target) { can.base.beginWith(target.innerHTML, _p) && carte.insertBefore(target, carte.firstChild) })
|
can.page.Select(can, carte, html.DIV_ITEM, function(target) { event.target.innerHTML.trim() != target.innerHTML.trim() && can.base.beginWith(target.innerHTML, _p) && carte.insertBefore(target, carte.firstChild) })
|
||||||
function remove(p) { if (p && p._sub) { remove(p._sub), can.page.Remove(can, p._sub), delete(p._sub) } } if (parent) { remove(parent), parent._sub = carte }
|
function remove(p) { if (p && p._sub) { remove(p._sub), can.page.Remove(can, p._sub), delete(p._sub) } } if (parent) { remove(parent), parent._sub = carte }
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -40,11 +40,11 @@ Volcanos(chat.ONSYNTAX, {
|
|||||||
"#": code.KEYWORD,
|
"#": code.KEYWORD,
|
||||||
},
|
},
|
||||||
regexp: {
|
regexp: {
|
||||||
"^u_\\w+$": code.DATATYPE,
|
"^u_\\w $": code.DATATYPE,
|
||||||
"^\\w+_t$": code.DATATYPE,
|
"^\\w _t$": code.DATATYPE,
|
||||||
"^\\w+_pt$": code.DATATYPE,
|
"^\\w _pt$": code.DATATYPE,
|
||||||
"^[-]*\\d+$": code.CONSTANT,
|
"^[-]*\\d $": code.CONSTANT,
|
||||||
"^[A-Z0-9_]+$": code.CONSTANT,
|
"^[A-Z0-9_] $": code.CONSTANT,
|
||||||
},
|
},
|
||||||
keyword: {
|
keyword: {
|
||||||
"#include": code.KEYWORD,
|
"#include": code.KEYWORD,
|
||||||
@ -107,9 +107,8 @@ Volcanos(chat.ONSYNTAX, {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
sh: {
|
sh: {
|
||||||
render: {},
|
|
||||||
split: {
|
split: {
|
||||||
operator: "=",
|
operator: "=()|><;",
|
||||||
},
|
},
|
||||||
prefix: {
|
prefix: {
|
||||||
"#": code.COMMENT,
|
"#": code.COMMENT,
|
||||||
@ -118,7 +117,7 @@ Volcanos(chat.ONSYNTAX, {
|
|||||||
" {": code.COMMENT,
|
" {": code.COMMENT,
|
||||||
},
|
},
|
||||||
regexp: {
|
regexp: {
|
||||||
"[A-Z0-9_]+": code.CONSTANT,
|
"[A-Z0-9_] ": code.CONSTANT,
|
||||||
},
|
},
|
||||||
keyword: {
|
keyword: {
|
||||||
"local": code.KEYWORD,
|
"local": code.KEYWORD,
|
||||||
@ -134,17 +133,42 @@ Volcanos(chat.ONSYNTAX, {
|
|||||||
"elif": code.KEYWORD,
|
"elif": code.KEYWORD,
|
||||||
"else": code.KEYWORD,
|
"else": code.KEYWORD,
|
||||||
"fi": code.KEYWORD,
|
"fi": code.KEYWORD,
|
||||||
|
"for": code.KEYWORD,
|
||||||
|
"while": code.KEYWORD,
|
||||||
|
"do": code.KEYWORD,
|
||||||
|
"done": code.KEYWORD,
|
||||||
"case": code.KEYWORD,
|
"case": code.KEYWORD,
|
||||||
"in": code.KEYWORD,
|
"in": code.KEYWORD,
|
||||||
"esac": code.KEYWORD,
|
"esac": code.KEYWORD,
|
||||||
|
|
||||||
|
"shift": code.FUNCTION,
|
||||||
"eval": code.FUNCTION,
|
"eval": code.FUNCTION,
|
||||||
|
"trap": code.FUNCTION,
|
||||||
"test": code.FUNCTION,
|
"test": code.FUNCTION,
|
||||||
"echo": code.FUNCTION,
|
"echo": code.FUNCTION,
|
||||||
"mkdir": code.FUNCTION,
|
|
||||||
"cat": code.FUNCTION,
|
"cat": code.FUNCTION,
|
||||||
"rm": code.FUNCTION,
|
"rm": code.FUNCTION,
|
||||||
|
"mkdir": code.FUNCTION,
|
||||||
|
"mktemp": code.FUNCTION,
|
||||||
|
"history": code.FUNCTION,
|
||||||
|
"complete": code.FUNCTION,
|
||||||
|
"compgen": code.FUNCTION,
|
||||||
|
"bind": code.FUNCTION,
|
||||||
|
"alias": code.FUNCTION,
|
||||||
|
|
||||||
|
"xargs": code.FUNCTION,
|
||||||
|
"curl": code.FUNCTION,
|
||||||
|
"sed": code.FUNCTION,
|
||||||
|
"tr": code.FUNCTION,
|
||||||
|
"du": code.FUNCTION,
|
||||||
|
"cut": code.FUNCTION,
|
||||||
|
"tail": code.FUNCTION,
|
||||||
|
"head": code.FUNCTION,
|
||||||
|
"grep": code.FUNCTION,
|
||||||
|
|
||||||
|
"/dev/null": code.CONSTANT,
|
||||||
|
"DEBUG": code.CONSTANT,
|
||||||
|
"EXIT": code.CONSTANT,
|
||||||
},
|
},
|
||||||
}, configure: {link: "sh"},
|
}, configure: {link: "sh"},
|
||||||
shy: {
|
shy: {
|
||||||
@ -171,11 +195,11 @@ Volcanos(chat.ONSYNTAX, {
|
|||||||
},
|
},
|
||||||
go: {
|
go: {
|
||||||
split: {
|
split: {
|
||||||
operator: "{([-+:;!.,*])}",
|
operator: "{([- :;!.,*])}",
|
||||||
},
|
},
|
||||||
regexp: {
|
regexp: {
|
||||||
"[0-9]+": code.CONSTANT,
|
"[0-9] ": code.CONSTANT,
|
||||||
"[A-Z_0-9]+": code.CONSTANT,
|
"[A-Z_0-9] ": code.CONSTANT,
|
||||||
},
|
},
|
||||||
prefix: {
|
prefix: {
|
||||||
"//": code.COMMENT,
|
"//": code.COMMENT,
|
||||||
@ -266,7 +290,7 @@ Volcanos(chat.ONSYNTAX, {
|
|||||||
},
|
},
|
||||||
js: {
|
js: {
|
||||||
split: {
|
split: {
|
||||||
operator: "{[(.,:;!?|<*>-+)]}",
|
operator: "{[(.,:;!?|<*>- )]}",
|
||||||
},
|
},
|
||||||
prefix: {
|
prefix: {
|
||||||
"// ": code.COMMENT,
|
"// ": code.COMMENT,
|
||||||
@ -342,8 +366,12 @@ Volcanos(chat.ONSYNTAX, {
|
|||||||
operator: ".[]()>,{:;}",
|
operator: ".[]()>,{:;}",
|
||||||
},
|
},
|
||||||
regexp: {
|
regexp: {
|
||||||
"[-0-9]+px": code.CONSTANT,
|
"[-0-9] px": code.CONSTANT,
|
||||||
"#[^ ;]+": code.CONSTANT,
|
"#[^ ;] ": code.CONSTANT,
|
||||||
|
},
|
||||||
|
prefix: {
|
||||||
|
"// ": code.COMMENT,
|
||||||
|
"/* ": code.COMMENT,
|
||||||
},
|
},
|
||||||
keyword: {
|
keyword: {
|
||||||
"body": code.KEYWORD,
|
"body": code.KEYWORD,
|
||||||
@ -367,6 +395,9 @@ Volcanos(chat.ONSYNTAX, {
|
|||||||
"h2": code.KEYWORD,
|
"h2": code.KEYWORD,
|
||||||
"h3": code.KEYWORD,
|
"h3": code.KEYWORD,
|
||||||
|
|
||||||
|
"hover": code.DATATYPE,
|
||||||
|
"focus": code.DATATYPE,
|
||||||
|
|
||||||
"background-color": code.FUNCTION,
|
"background-color": code.FUNCTION,
|
||||||
"font-family": code.FUNCTION,
|
"font-family": code.FUNCTION,
|
||||||
"font-weight": code.FUNCTION,
|
"font-weight": code.FUNCTION,
|
||||||
|
@ -28,7 +28,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) {
|
|||||||
Volcanos(chat.ONFIGURE, {
|
Volcanos(chat.ONFIGURE, {
|
||||||
create: function(can, target, zone, path) {
|
create: function(can, target, zone, path) {
|
||||||
can.isCmdMode()? can.onappend._action(can, can.base.Obj(can._msg.Option(ice.MSG_ACTION)).concat(
|
can.isCmdMode()? can.onappend._action(can, can.base.Obj(can._msg.Option(ice.MSG_ACTION)).concat(
|
||||||
["favor", "git", "首页", "官网" , "文档" , "百度"], window.webview? ["浏览器", "录屏", "编辑器", "日志"]: [],
|
["favor", "git", "首页", "官网" , "文档" , "百度"], window.webview? ["浏览器", "录屏", "日志", "编辑器"]: [],
|
||||||
), target): can.onmotion.hidden(can, target.parentNode)
|
), target): can.onmotion.hidden(can, target.parentNode)
|
||||||
},
|
},
|
||||||
recent: function(can, target, zone, path) { var total = 0
|
recent: function(can, target, zone, path) { var total = 0
|
||||||
|
@ -142,7 +142,7 @@ Volcanos(chat.ONACTION, {list: [
|
|||||||
"生成链接": function(event, can) { can.onmotion.share(event, can, [], [mdb.LINK, can.user.copy(event, can, can.onexport.link(can))]) },
|
"生成链接": function(event, can) { can.onmotion.share(event, can, [], [mdb.LINK, can.user.copy(event, can, can.onexport.link(can))]) },
|
||||||
"生成脚本": function(event, can) { var conf = can.Conf()
|
"生成脚本": function(event, can) { var conf = can.Conf()
|
||||||
var args = can.Input().join(ice.SP), list = [
|
var args = can.Input().join(ice.SP), list = [
|
||||||
"export ctx_dev="+location.origin+"; ctx_temp=$(mktemp); curl -o $ctx_temp -fsSL $ctx_dev;"+" source $ctx_temp "+(conf.index||"")+ice.SP+args,
|
"export ctx_dev="+location.origin+"; ctx_temp=$(mktemp); curl -o $ctx_temp -fsSL $ctx_dev;"+" source $ctx_temp cmd "+(conf.index||"")+ice.SP+args,
|
||||||
"ish_sys_dev_run_command "+args, "ish_sys_dev_run_action", "ish_sys_dev_run_source",
|
"ish_sys_dev_run_command "+args, "ish_sys_dev_run_action", "ish_sys_dev_run_source",
|
||||||
]
|
]
|
||||||
can.user.copy(event, can, list[0])
|
can.user.copy(event, can, list[0])
|
||||||
|
@ -163,7 +163,11 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl
|
|||||||
meta.type = "plug", can.onappend.plugin(can, meta, function(sub) { sub.sup = can
|
meta.type = "plug", can.onappend.plugin(can, meta, function(sub) { sub.sup = can
|
||||||
sub.ConfHeight(target.offsetHeight-2*html.ACTION_HEIGHT), sub.ConfWidth(target.offsetWidth)
|
sub.ConfHeight(target.offsetHeight-2*html.ACTION_HEIGHT), sub.ConfWidth(target.offsetWidth)
|
||||||
can.page.style(can, sub._output, html.MAX_HEIGHT, sub.ConfHeight(), html.MAX_WIDTH, sub.ConfWidth())
|
can.page.style(can, sub._output, html.MAX_HEIGHT, sub.ConfHeight(), html.MAX_WIDTH, sub.ConfWidth())
|
||||||
sub.run = function(event, cmds, cb) { can.runActionCommand(can.request(event, can.Option()), meta.index, cmds, cb) }
|
sub.run = function(event, cmds, cb) {
|
||||||
|
if (can.page.Select(can, sub._option, "input[name=path]").length > 0 && sub.Option(nfs.PATH) == "") {
|
||||||
|
sub.request(event, {path: "./"})
|
||||||
|
}
|
||||||
|
can.runActionCommand(can.request(event, can.Option()), meta.index, cmds, cb) }
|
||||||
sub.onaction.close = function() { can.onmotion.hidden(can, target) }
|
sub.onaction.close = function() { can.onmotion.hidden(can, target) }
|
||||||
can.base.isFunc(cb) && cb(sub)
|
can.base.isFunc(cb) && cb(sub)
|
||||||
}, target)
|
}, target)
|
||||||
|
3
proto.js
3
proto.js
@ -64,12 +64,13 @@ var ctx = {
|
|||||||
EXTRA_INDEX: "extra.index", EXTRA_ARGS: "extra.args",
|
EXTRA_INDEX: "extra.index", EXTRA_ARGS: "extra.args",
|
||||||
}
|
}
|
||||||
var cli = {
|
var cli = {
|
||||||
DAEMON: "daemon",
|
SYSTEM: "system", DAEMON: "daemon",
|
||||||
BEGIN: "begin", START: "start", OPEN: "open", CLOSE: "close", STOP: "stop", END: "end", RESTART: "restart",
|
BEGIN: "begin", START: "start", OPEN: "open", CLOSE: "close", STOP: "stop", END: "end", RESTART: "restart",
|
||||||
COLOR: "color", WHITE: "white", BLACK: "black", RED: "red", GREEN: "green", BLUE: "blue",
|
COLOR: "color", WHITE: "white", BLACK: "black", RED: "red", GREEN: "green", BLUE: "blue",
|
||||||
YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta", GLASS: "#0000",
|
YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta", GLASS: "#0000",
|
||||||
MAKE: "make", MAIN: "main", EXEC: "exec", DONE: "done", COST: "cost", FROM: "from", CLEAR: "clear",
|
MAKE: "make", MAIN: "main", EXEC: "exec", DONE: "done", COST: "cost", FROM: "from", CLEAR: "clear",
|
||||||
PWD: "pwd",
|
PWD: "pwd",
|
||||||
|
ORDER: "order",
|
||||||
}
|
}
|
||||||
var aaa = {
|
var aaa = {
|
||||||
LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token",
|
LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user