1
0
forked from x/icebergs

opt chat.user

This commit is contained in:
shaoying 2020-09-23 08:21:13 +08:00
parent 40b4e1756a
commit 0302e97674
12 changed files with 157 additions and 86 deletions

View File

@ -17,13 +17,11 @@ func _user_list(m *ice.Message) {
m.Sort(USERNAME) m.Sort(USERNAME)
} }
func _user_login(m *ice.Message, name, word string) (ok bool) { func _user_login(m *ice.Message, name, word string) (ok bool) {
m.Debug("what %v %v", name, word)
if m.Richs(USER, nil, name, nil) == nil { if m.Richs(USER, nil, name, nil) == nil {
_user_create(m, name, "") _user_create(m, name, "")
} }
m.Richs(USER, nil, name, func(key string, value map[string]interface{}) { m.Richs(USER, nil, name, func(key string, value map[string]interface{}) {
m.Debug("what %v %v", name, word)
if kit.Format(value[PASSWORD]) == "" { if kit.Format(value[PASSWORD]) == "" {
ok, value[PASSWORD] = true, word ok, value[PASSWORD] = true, word
} else if value[PASSWORD] == word { } else if value[PASSWORD] == word {

View File

@ -51,7 +51,9 @@ var Index = &ice.Context{Name: "ctx", Help: "配置模块",
} else { } else {
m.Search(arg[0]+".", func(p *ice.Context, s *ice.Context, key string) { m.Search(arg[0]+".", func(p *ice.Context, s *ice.Context, key string) {
msg := m.Spawn(s) msg := m.Spawn(s)
switch arg[1] { switch kit.Select(CONTEXT, arg, 1) {
case CONTEXT:
_context_list(msg, true)
case COMMAND: case COMMAND:
msg.Cmdy(COMMAND, arg[0], arg[2:]) msg.Cmdy(COMMAND, arg[0], arg[2:])
case CONFIG: case CONFIG:

View File

@ -29,12 +29,12 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt
if !msg.Options(ice.MSG_USERNAME) && tcp.IPIsLocal(msg, msg.Option(ice.MSG_USERIP)) { if !msg.Options(ice.MSG_USERNAME) && tcp.IPIsLocal(msg, msg.Option(ice.MSG_USERIP)) {
// 自动认证 // 自动认证
if aaa.UserLogin(msg, cli.UserName, cli.PassWord) { // if aaa.UserLogin(msg, cli.UserName, cli.PassWord) {
if strings.HasPrefix(msg.Option(ice.MSG_USERUA), "Mozilla/5.0") { // if strings.HasPrefix(msg.Option(ice.MSG_USERUA), "Mozilla/5.0") {
// msg.Option(ice.MSG_SESSID, aaa.SessCreate(msg, msg.Option(ice.MSG_USERNAME), msg.Option(ice.MSG_USERROLE))) // // msg.Option(ice.MSG_SESSID, aaa.SessCreate(msg, msg.Option(ice.MSG_USERNAME), msg.Option(ice.MSG_USERROLE)))
// Render(msg, "cookie", msg.Option(ice.MSG_SESSID)) // // Render(msg, "cookie", msg.Option(ice.MSG_SESSID))
} // }
} // }
} }
if _, ok := msg.Target().Commands[LOGIN]; ok { if _, ok := msg.Target().Commands[LOGIN]; ok {
@ -234,6 +234,10 @@ func init() {
"black", kit.Dict(), "black", kit.Dict(),
"white", kit.Dict( "white", kit.Dict(
"header", true, "header", true,
"river", true,
"action", true,
"footer", true,
"login", true, "login", true,
"share", true, "share", true,
"space", true, "space", true,

View File

@ -253,32 +253,32 @@ func _trash(m *ice.Message, arg ...string) {
} }
} }
func ShareCreate(m *ice.Message, kind, name, text string, arg ...string) string {
return _share_create(m, kind, name, text, arg...)
}
const SHARE = "share" const SHARE = "share"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{ Configs: map[string]*ice.Config{
SHARE: {Name: "share", Help: "共享链", Value: kit.Data( SHARE: {Name: "share", Help: "共享链", Value: kit.Data(
"template", share_template, "expire", "72h", "expire", "72h", "template", share_template,
"limit", 10,
)}, )},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
SHARE: {Name: "share share=auto auto", Help: "共享链", Action: map[string]*ice.Action{ SHARE: {Name: "share hash auto", Help: "共享链", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create type name text arg...", Help: "创建", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_share_create(m, arg[0], arg[1], arg[2], arg[3:]...) m.Cmdy(mdb.INSERT, SHARE, "", mdb.HASH,
aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME),
"river", m.Option(ice.MSG_RIVER), "storm", m.Option(ice.MSG_STORM),
kit.MDB_TIME, m.Time(m.Conf(SHARE, "meta.expire")), arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) < 2 { m.Option(mdb.FIELDS, "time,hash,userrole,username,river,storm,type,name,text")
_share_list(m, kit.Select("", arg, 0)) m.Cmdy(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, arg)
return m.PushAction("删除")
}
_share_create(m, arg[0], arg[1], arg[2], arg[3:]...)
}}, }},
"/share/local/": {Name: "/share/local/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/share/local/": {Name: "/share/local/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
_share_local(m, arg...) _share_local(m, arg...)
}}, }},

View File

@ -5,7 +5,6 @@ import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
aaa "github.com/shylinux/icebergs/base/aaa" aaa "github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/gdb"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"github.com/shylinux/toolkits/task" "github.com/shylinux/toolkits/task"
@ -13,6 +12,7 @@ import (
"math/rand" "math/rand"
"net" "net"
"net/url" "net/url"
"os"
"strings" "strings"
"time" "time"
) )
@ -41,7 +41,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) {
host := kit.Format(client["hostname"]) host := kit.Format(client["hostname"])
proto := kit.Select("ws", "wss", client["protocol"] == "https") proto := kit.Select("ws", "wss", client["protocol"] == "https")
uri := kit.MergeURL(proto+"://"+host+"/space/", "name", name, "type", cli.NodeType) uri := kit.MergeURL(proto+"://"+host+"/space/", "name", name, "type", cli.NodeType, "share", os.Getenv("ctx_share"), "river", os.Getenv("ctx_river"))
if u, e := url.Parse(uri); m.Assert(e) { if u, e := url.Parse(uri); m.Assert(e) {
task.Put(dev, func(task *task.Task) error { task.Put(dev, func(task *task.Task) error {
@ -206,6 +206,10 @@ const (
WORKER = "worker" WORKER = "worker"
) )
const (
SPACE_START = "space.start"
SPACE_CLOSE = "space.close"
)
const SPACE = "space" const SPACE = "space"
func init() { func init() {
@ -243,9 +247,11 @@ func init() {
if s, e := websocket.Upgrade(m.W, m.R, nil, m.Confi(SPACE, "meta.buffer.r"), m.Confi(SPACE, "meta.buffer.w")); m.Assert(e) { if s, e := websocket.Upgrade(m.W, m.R, nil, m.Confi(SPACE, "meta.buffer.r"), m.Confi(SPACE, "meta.buffer.w")); m.Assert(e) {
name := m.Option(kit.MDB_NAME, strings.Replace(kit.Select(m.Option(ice.MSG_USERADDR), m.Option(kit.MDB_NAME)), ".", "_", -1)) name := m.Option(kit.MDB_NAME, strings.Replace(kit.Select(m.Option(ice.MSG_USERADDR), m.Option(kit.MDB_NAME)), ".", "_", -1))
kind := kit.Select(WORKER, m.Option(kit.MDB_TYPE)) kind := kit.Select(WORKER, m.Option(kit.MDB_TYPE))
share := m.Option("share")
river := m.Option("river")
// 添加节点 // 添加节点
h := m.Rich(SPACE, nil, kit.Dict("socket", s, h := m.Rich(SPACE, nil, kit.Dict("socket", s, "share", share, "river", river,
kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, s.RemoteAddr().String(), kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, s.RemoteAddr().String(),
)) ))
m.Log_CREATE(SPACE, name) m.Log_CREATE(SPACE, name)
@ -257,8 +263,8 @@ func init() {
m.Event(DREAM_START, name) m.Event(DREAM_START, name)
defer m.Event(DREAM_STOP, name) defer m.Event(DREAM_STOP, name)
default: default:
m.Event(gdb.SPACE_START, kind, name) m.Event(SPACE_START, "type", kind, "name", name, "share", share, "river", river)
defer m.Event(gdb.SPACE_CLOSE, kind, name) defer m.Event(SPACE_CLOSE, "type", kind, "name", name, "share", share, "river", river)
} }
_space_handle(m, false, m.Target().Server().(*Frame).send, s, name) _space_handle(m, false, m.Target().Server().(*Frame).send, s, name)
m.Log(ice.LOG_CLOSE, "%s: %s", name, kit.Format(m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h)))) m.Log(ice.LOG_CLOSE, "%s: %s", name, kit.Format(m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h))))

View File

@ -72,7 +72,7 @@ func _spide_create(m *ice.Message, name, address string, arg ...string) {
dir, file := path.Split(uri.EscapedPath()) dir, file := path.Split(uri.EscapedPath())
m.Rich(SPIDE, nil, kit.Dict( m.Rich(SPIDE, nil, kit.Dict(
"cookie", kit.Dict(), "header", kit.Dict(), "client", kit.Dict( "cookie", kit.Dict(), "header", kit.Dict(), "client", kit.Dict(
"share", ShareCreate(m.Spawn(), SPIDE, name, address), // "share", ShareCreate(m.Spawn(), SPIDE, name, address),
"name", name, "url", address, "method", "POST", "name", name, "url", address, "method", "POST",
"protocol", uri.Scheme, "hostname", uri.Host, "protocol", uri.Scheme, "hostname", uri.Host,
"path", dir, "file", file, "query", uri.RawQuery, "path", dir, "file", file, "query", uri.RawQuery,

View File

@ -248,6 +248,9 @@ func init() {
m.Cmdy(ctx.COMMAND, arg[0]) m.Cmdy(ctx.COMMAND, arg[0])
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) {
return
}
if m.Warn(!_action_right(m, m.Option(ice.MSG_RIVER, arg[0]), m.Option(ice.MSG_STORM, arg[1])), ice.ErrNotAuth) { if m.Warn(!_action_right(m, m.Option(ice.MSG_RIVER, arg[0]), m.Option(ice.MSG_STORM, arg[1])), ice.ErrNotAuth) {
return return
} }

View File

@ -16,6 +16,7 @@ var Index = &ice.Context{Name: CHAT, Help: "聊天中心",
"base", kit.Dict( "base", kit.Dict(
"info", []interface{}{ "info", []interface{}{
"web.chat.info", "web.chat.info",
"web.chat.code",
"web.chat.node", "web.chat.node",
"web.chat.tool", "web.chat.tool",
"web.chat.user", "web.chat.user",
@ -27,6 +28,8 @@ var Index = &ice.Context{Name: CHAT, Help: "聊天中心",
}, },
), ),
)) ))
m.Watch(web.SPACE_START, m.Prefix(NODE))
m.Watch(web.SPACE_CLOSE, m.Prefix(NODE))
}}, }},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Save(RIVER) m.Save(RIVER)

View File

@ -10,6 +10,15 @@ import (
) )
func _river_list(m *ice.Message) { func _river_list(m *ice.Message) {
if m.Option("share") != "" && m.Option("share") != "" {
m.Option(ice.MSG_RIVER, m.Option("river"))
if m.Cmd(CODE, m.Option("share")).Append(kit.MDB_TYPE) == USER {
if m.Cmd(USER, m.Option(ice.MSG_USERNAME)).Append(ice.MSG_USERNAME) == "" {
m.Cmd(USER, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
}
}
}
m.Set(ice.MSG_OPTION, kit.MDB_KEY) m.Set(ice.MSG_OPTION, kit.MDB_KEY)
m.Set(ice.MSG_OPTION, kit.MDB_NAME) m.Set(ice.MSG_OPTION, kit.MDB_NAME)
@ -20,13 +29,14 @@ func _river_list(m *ice.Message) {
} }
m.Richs(RIVER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { m.Richs(RIVER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, USER), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) { m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, USER), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) {
m.Push(key, value[kit.MDB_META], []string{kit.MDB_KEY, kit.MDB_NAME}, val[kit.MDB_META]) m.Push(key, value[kit.MDB_META], []string{kit.MDB_HASH, kit.MDB_NAME}, val[kit.MDB_META])
}) })
}) })
} }
const ( const (
INFO = "info" INFO = "info"
CODE = "code"
NODE = "node" NODE = "node"
TOOL = "tool" TOOL = "tool"
USER = "user" USER = "user"
@ -41,96 +51,136 @@ func init() {
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
INFO: {Name: "info auto", Help: "信息", Action: map[string]*ice.Action{ INFO: {Name: "info auto", Help: "信息", Action: map[string]*ice.Action{
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.EXPORT, RIVER, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) m.Cmdy(mdb.MODIFY, RIVER, "", mdb.HASH, kit.MDB_HASH, m.Option(ice.MSG_RIVER), arg)
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, mdb.DETAIL) m.Option(mdb.FIELDS, mdb.DETAIL)
m.Cmdy(mdb.SELECT, RIVER, "", mdb.HASH, kit.MDB_HASH, m.Option(ice.MSG_RIVER)) m.Cmdy(mdb.SELECT, RIVER, "", mdb.HASH, kit.MDB_HASH, m.Option(ice.MSG_RIVER))
}}, }},
NODE: {Name: "node hash=auto auto 添加 启动", Help: "设备", Action: map[string]*ice.Action{ CODE: {Name: "code hash auto 添加", Help: "共享", Action: map[string]*ice.Action{
"invite": {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create type=node,user name text", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), CODE), mdb.HASH,
aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME),
kit.MDB_TIME, m.Time("72h"), arg)
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), CODE), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), CODE), mdb.HASH,
kit.MDB_HASH, m.Option(kit.MDB_HASH))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, "time,hash,userrole,username,type,name,text")
m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), CODE), mdb.HASH, kit.MDB_HASH, arg)
m.PushAction("删除")
}},
NODE: {Name: "node name ctx cmd auto 邀请", Help: "设备", Action: map[string]*ice.Action{
"invite": {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) {
m.Option(web.SHARE, m.Cmdx(CODE, mdb.CREATE, "type", NODE))
m.Cmdy("web.code.publish", "contexts", "tool") m.Cmdy("web.code.publish", "contexts", "tool")
}}, }},
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { web.SPACE_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("web.code.publish", "contexts", "tool") if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" {
return
}
if msg := m.Cmd(CODE, m.Option("share")); msg.Append(kit.MDB_TYPE) == NODE {
m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(RIVER), NODE), mdb.HASH, arg)
}
}}, }},
mdb.INSERT: {Name: "insert route", Help: "添加", Hand: func(m *ice.Message, arg ...string) { web.SPACE_CLOSE: {Name: "close", Help: "关闭", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH, arg)
}},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
}}, }},
// mdb.INSERT: {Name: "insert route", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
// m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH, arg)
// }},
// mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
// m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
// }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.ROUTE) m.Cmdy(web.ROUTE)
}}, }},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(RIVER), NODE), mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, "time,hash,route") if len(arg) == 0 {
m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH) m.Option(mdb.FIELDS, "time,type,name,share")
m.Table(func(index int, value map[string]string, head []string) { m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH)
m.Push(kit.MDB_LINK, kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value["route"]))) m.PushAction("删除")
}) return
m.PushAction("删除") }
m.Cmdy(web.ROUTE, arg)
}}, }},
TOOL: {Name: "tool key auto 添加 创建", Help: "工具", Action: map[string]*ice.Action{ TOOL: {Name: "tool hash auto 添加 创建", Help: "工具", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, arg) m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, arg)
}}, }},
mdb.INSERT: {Name: "insert pod ctx cmd help", Help: "添加", Hand: func(m *ice.Message, arg ...string) { mdb.INSERT: {Name: "insert hash pod ctx cmd help", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, m.Option(ice.MSG_STORM)), mdb.LIST, arg) m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, m.Option(kit.MDB_HASH)), mdb.LIST, arg[2:])
}}, }},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_ID) != "" { if m.Option(kit.MDB_ID) != "" {
m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, m.Option(ice.MSG_STORM)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg) m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, m.Option(kit.MDB_HASH)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg)
} else { } else {
m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg)
} }
}}, }},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case "pod": case "hash":
_storm_list(m, m.Option(ice.MSG_RIVER)) m.Cmd(TOOL).Table(func(index int, value map[string]string, head []string) {
case "ctx": m.Push("hash", value["hash"])
m.Cmdy(ctx.CONTEXT) m.Push("name", value["name"])
case "cmd", "help": })
m.Cmdy(ctx.CONTEXT, m.Option("ctx"), ctx.COMMAND) case POD:
m.Cmdy(web.ROUTE)
case CTX:
m.Cmd(ctx.CONTEXT, "web").Table(func(index int, value map[string]string, head []string) {
m.Push(CTX, kit.Keys(kit.Select("", value["ups"], value["ups"] != "shy"), value["name"]))
m.Push("help", value["help"])
})
case CMD, "help":
m.Cmd(ctx.CONTEXT, m.Option(CTX), ctx.COMMAND).Table(func(index int, value map[string]string, head []string) {
m.Push(CMD, value["key"])
m.Push("name", value["name"])
m.Push("help", value["help"])
})
} }
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
m.Option(mdb.FIELDS, "time,key,name,count") m.Option(mdb.FIELDS, "time,hash,name,count")
m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH) m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH)
} else { m.PushAction("删除")
m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,help") return
m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, arg[1:]) }
if len(m.Appendv(CMD)) == 0 {
m.Push("time", m.Time()) m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,help")
m.Push("id", "") m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, arg[1:])
m.Push("pod", "") if len(m.Appendv(CMD)) == 0 && len(arg) > 1 {
m.Push("ctx", "") m.Push("cmd", arg[1])
m.Push("cmd", arg[1])
m.Push("help", "")
}
} }
m.PushAction("删除")
}}, }},
USER: {Name: "user hash=auto auto 添加 邀请", Help: "用户", Action: map[string]*ice.Action{ USER: {Name: "user username auto 邀请", Help: "用户", Action: map[string]*ice.Action{
"invite": {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { "invite": {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("web.wiki.spark", "inner", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER))) share := m.Option(web.SHARE, m.Cmdx(CODE, mdb.CREATE, kit.MDB_TYPE, USER))
m.Cmdy("web.wiki.image", "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER))) m.Cmdy("web.wiki.spark", "inner", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER), "share", share))
m.Cmdy("web.wiki.image", "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER), "share", share))
m.Render("") m.Render("")
}}, }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INSERT: {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(aaa.USER)
}},
mdb.INSERT: {Name: "insert username", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH, arg) m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH, arg)
}}, }},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH, aaa.USERNAME, m.Option(aaa.USERNAME))
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, "time,hash,username") m.Option(mdb.FIELDS, "time,username")
m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH) m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH, aaa.USERNAME, arg)
m.Table(func(index int, value map[string]string, head []string) { m.Table(func(index int, value map[string]string, head []string) {
m.Push(aaa.USERZONE, aaa.UserZone(m, value[aaa.USERNAME])) m.Push(aaa.USERZONE, aaa.UserZone(m, value[aaa.USERNAME]))
m.Push(aaa.USERNICK, aaa.UserNick(m, value[aaa.USERNAME])) m.Push(aaa.USERNICK, aaa.UserNick(m, value[aaa.USERNAME]))
@ -144,14 +194,15 @@ func init() {
m.Echo(h) m.Echo(h)
m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, USER, kit.MDB_META, kit.MDB_SHORT), aaa.USERNAME) m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, USER, kit.MDB_META, kit.MDB_SHORT), aaa.USERNAME)
m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, NODE, kit.MDB_META, kit.MDB_SHORT), kit.MDB_NAME)
m.Cmd(USER, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) m.Cmd(USER, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
kit.Fetch(m.Confv(RIVER, kit.Keys("meta.template", "base")), func(storm string, value interface{}) { kit.Fetch(m.Confv(RIVER, kit.Keys("meta.template", "base")), func(storm string, value interface{}) {
h := m.Cmdx(TOOL, mdb.CREATE, kit.MDB_TYPE, "public", kit.MDB_NAME, storm, kit.MDB_TEXT, storm) h := m.Cmdx(TOOL, mdb.CREATE, kit.MDB_TYPE, "public", kit.MDB_NAME, storm, kit.MDB_TEXT, storm)
m.Option(ice.MSG_STORM, h)
kit.Fetch(value, func(index int, value string) { kit.Fetch(value, func(index int, value string) {
m.Search(value, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) { m.Search(value, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) {
m.Cmd(TOOL, mdb.INSERT, "pod", "", "ctx", s.Cap(ice.CTX_FOLLOW), "cmd", key, "help", kit.Simple(cmd.Help)[0]) m.Cmd(TOOL, mdb.INSERT, kit.MDB_HASH, h, "ctx", s.Cap(ice.CTX_FOLLOW), "cmd", key, "help", kit.Simple(cmd.Help)[0])
}) })
}) })
}) })
@ -174,13 +225,16 @@ func init() {
}}, }},
"/river": {Name: "/river", Help: "小河流", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/river": {Name: "/river", Help: "小河流", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) {
return
}
if len(arg) == 0 { if len(arg) == 0 {
_river_list(m) _river_list(m)
return return
} }
if len(arg) == 1 { if len(arg) > 1 && arg[1] == TOOL {
m.Option(ice.MSG_RIVER, arg[0]) m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy(TOOL, arg[1:]) m.Cmdy(TOOL, arg[2:])
return return
} }
if !m.Warn(!m.Right(RIVER, arg), ice.ErrNotAuth) { if !m.Warn(!m.Right(RIVER, arg), ice.ErrNotAuth) {

View File

@ -98,7 +98,7 @@ export ctx_dev={{.Option "httphost"}} ctx_temp=$(mktemp); curl -sL $ctx_dev >$ct
"tool", ` "tool", `
# 生产环境 # 生产环境
mkdir contexts; cd contexts mkdir contexts; cd contexts
export ctx_dev={{.Option "httphost"}} ctx_share={{.Option "share"}} ctx_temp=$(mktemp); curl -sL $ctx_dev >$ctx_temp; source $ctx_temp dev export ctx_dev={{.Option "httphost"}} ctx_river={{.Option "sess.river"}} ctx_share={{.Option "share"}} ctx_temp=$(mktemp); curl -sL $ctx_dev >$ctx_temp; source $ctx_temp ice
`, `,
) )

View File

@ -9,6 +9,7 @@ import (
) )
var ErrWarn = "warn: " var ErrWarn = "warn: "
var ErrNotLogin = "not login: "
var ErrNotAuth = "not auth: " var ErrNotAuth = "not auth: "
var ErrNotJoin = "not join: " var ErrNotJoin = "not join: "
var ErrNotFound = "not found: " var ErrNotFound = "not found: "

View File

@ -53,8 +53,8 @@ func init() {
}}, }},
"/crx": {Name: "/crx", Help: "插件", Action: map[string]*ice.Action{ "/crx": {Name: "/crx", Help: "插件", Action: map[string]*ice.Action{
web.HISTORY: {Name: "history", Help: "历史记录", Hand: func(m *ice.Message, arg ...string) { web.HISTORY: {Name: "history", Help: "历史记录", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SPIDE, web.SPIDE_SELF, "/code/chrome/sync", // m.Cmdy(web.SPIDE, web.SPIDE_SELF, "/code/chrome/sync",
kit.MDB_NAME, arg[1], kit.MDB_TEXT, arg[2]) // kit.MDB_NAME, arg[1], kit.MDB_TEXT, arg[2])
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
}}, }},