1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 01:24:05 +08:00

opt chat.river

This commit is contained in:
shaoying 2020-09-08 19:52:25 +08:00
parent 67c79631d5
commit dae75f4aab
7 changed files with 130 additions and 145 deletions

View File

@ -38,7 +38,7 @@ func _hash_select(m *ice.Message, prefix, key, field, value string) {
if m.Option(FIELDS) == "detail" {
m.Push("detail", val)
} else {
m.Push(key, val, fields)
m.Push(key, val, fields, val[kit.MDB_META])
}
})
if m.Option(FIELDS) != "detail" {
@ -47,6 +47,9 @@ func _hash_select(m *ice.Message, prefix, key, field, value string) {
}
func _hash_modify(m *ice.Message, prefix, key string, field, value string, arg ...string) {
m.Richs(prefix, key, value, func(key string, value map[string]interface{}) {
if value[kit.MDB_META] != nil {
value = value[kit.MDB_META].(map[string]interface{})
}
for i := 0; i < len(arg)-1; i += 2 {
if arg[i] == field {
continue
@ -136,16 +139,19 @@ func _list_delete(m *ice.Message, prefix, chain, field, value string) {
}
func _list_select(m *ice.Message, prefix, key, field, value string) {
fields := strings.Split(kit.Select("time,type,name,text", m.Option("fields")), ",")
m.Grows(prefix, key, field, value, func(index int, value map[string]interface{}) {
if field == kit.MDB_ID {
m.Push("detail", value)
m.Grows(prefix, key, field, value, func(index int, val map[string]interface{}) {
if field == kit.MDB_ID && value != "" {
m.Push("detail", val)
return
}
m.Push("", value, fields)
m.Push("", val, fields, val[kit.MDB_META])
})
}
func _list_modify(m *ice.Message, prefix, key string, field, value string, arg ...string) {
m.Grows(prefix, key, field, value, func(index int, value map[string]interface{}) {
if value[kit.MDB_META] != nil {
value = value[kit.MDB_META].(map[string]interface{})
}
for i := 0; i < len(arg)-1; i += 2 {
if arg[i] == field {
continue

View File

@ -10,7 +10,6 @@ import (
"bytes"
"encoding/base64"
"encoding/binary"
"errors"
"fmt"
"io"
@ -20,9 +19,7 @@ import (
"os/exec"
"path"
"strings"
"syscall"
"time"
"unsafe"
"github.com/kr/pty"
"golang.org/x/crypto/ssh"
@ -35,13 +32,6 @@ type Winsize struct {
y uint16
}
func _ssh_size(fd uintptr, b []byte) {
w := binary.BigEndian.Uint32(b)
h := binary.BigEndian.Uint32(b[4:])
ws := &Winsize{Width: uint16(w), Height: uint16(h)}
syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(ws)))
}
func _ssh_exec(m *ice.Message, cmd string, arg []string, env []string, tty io.ReadWriter, done func()) {
m.Log_IMPORT("cmd", cmd, "arg", arg, "env", env)
c := exec.Command(cmd, arg...)
@ -135,25 +125,6 @@ func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh
list = append(list, env.Name+"="+env.Value)
case "exec":
if meta["username"] == "revert" {
n, e := channel.Write([]byte("pwd"))
n, e = channel.Write([]byte("pwd"))
n, e = channel.Write([]byte("pwd"))
n, e = channel.Write([]byte("pwd"))
n, e = channel.Write([]byte("pwd"))
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
break
}
_ssh_exec(m, shell, []string{"-c", string(request.Payload[4 : request.Payload[3]+4])}, list,
channel, func() { channel.Close() })
case "shell":
@ -168,16 +139,6 @@ func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh
if meta["username"] == "revert" {
n, e := channel.Write([]byte("pwd"))
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
m.Debug("what %v %v", n, e)
break
} else if meta["username"] == "ssh" {
@ -286,14 +247,14 @@ func _ssh_config(m *ice.Message) *ssh.ServerConfig {
return &ssh.Permissions{Extensions: meta}, res
},
PasswordCallback: func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) {
res := errors.New(ice.ErrNotAuth)
meta, res := map[string]string{"username": conn.User()}, errors.New(ice.ErrNotAuth)
m.Richs(aaa.USER, "", conn.User(), func(k string, value map[string]interface{}) {
if string(password) == kit.Format(value[aaa.PASSWORD]) {
m.Log_AUTH(aaa.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.PASSWORD, strings.Repeat("*", len(kit.Format(value[aaa.PASSWORD]))))
res = nil
}
})
return &ssh.Permissions{}, res
return &ssh.Permissions{Extensions: meta}, res
},
}

View File

@ -198,11 +198,6 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心",
}},
"tool": {Name: "tool", Help: "应用", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
}},
"node": {Name: "node", Help: "设备", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
}},
"/ocean": {Name: "/ocean", Help: "大海洋", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
// 用户列表

View File

@ -4,6 +4,7 @@ import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp"
"github.com/shylinux/icebergs/base/web"
@ -29,20 +30,6 @@ func _river_list(m *ice.Message) {
})
})
}
func _river_node(m *ice.Message, river string, node ...string) {
prefix := kit.Keys(kit.MDB_HASH, river, NODE)
for _, v := range node {
m.Rich(RIVER, prefix, kit.Data(kit.MDB_NAME, v))
m.Log_INSERT(RIVER, river, NODE, v)
}
}
func _river_user(m *ice.Message, river string, user ...string) {
prefix := kit.Keys(kit.MDB_HASH, river, USER)
for _, v := range user {
m.Rich(RIVER, prefix, kit.Data(aaa.USERNAME, v))
m.Log_INSERT(RIVER, river, USER, v)
}
}
func _river_share(m *ice.Message, river, name string, arg ...string) {
m.Cmdy(web.SHARE, RIVER, name, river, arg)
}
@ -68,7 +55,10 @@ func _river_create(m *ice.Message, kind, name, text string, arg ...string) {
))
m.Log_CREATE(kit.MDB_META, RIVER, kit.MDB_TYPE, kind, kit.MDB_NAME, name)
_river_user(m, h, cli.UserName, m.Option(ice.MSG_USERNAME))
m.Option(ice.MSG_RIVER, h)
m.Cmdy(m.Prefix(USER), mdb.INSERT, aaa.USERNAME, cli.UserName)
m.Cmdy(m.Prefix(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{}) {
list := []string{}
kit.Fetch(value, func(index int, value string) {
@ -97,9 +87,10 @@ func init() {
"template", kit.Dict(
"base", kit.Dict(
"info", []interface{}{
"web.chat.user",
"web.chat.tool",
"web.chat.info",
"web.chat.tool",
"web.chat.node",
"web.chat.user",
},
"miss", []interface{}{
"web.team.task",
@ -143,84 +134,84 @@ func init() {
m.Push("detail", value[kit.MDB_META])
})
}},
"user": {Name: "user auto", Help: "用户", Action: map[string]*ice.Action{
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
if m.Option(aaa.USERNAME) == cli.UserName {
return
TOOL: {Name: "tool hash=auto auto 添加 创建", Help: "工具", Action: map[string]*ice.Action{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case "storm":
_storm_list(m, m.Option(ice.MSG_RIVER))
case "ctx":
m.Cmdy(ctx.COMMAND)
case "cmd", "help":
m.Cmdy(ctx.COMMAND)
}
if m.Option(aaa.USERNAME) == m.Option(ice.MSG_USERNAME) {
return
}
m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) {
m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), m.Option(aaa.USERNAME), func(key string, value map[string]interface{}) {
m.Conf(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER, kit.MDB_HASH, key), "")
m.Log_DELETE(RIVER, m.Option(ice.MSG_RIVER), USER, m.Option(aaa.USERNAME))
})
})
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) {
m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
value = value[kit.MDB_META].(map[string]interface{})
m.Push(key, value, []string{kit.MDB_TIME})
m.Push(aaa.USERZONE, aaa.UserZone(m, value[aaa.USERNAME]))
m.Push(aaa.USERNICK, aaa.UserNick(m, value[aaa.USERNAME]))
m.Push(key, value, []string{aaa.USERNAME})
})
})
m.PushAction("删除")
}},
"tool": {Name: "tool storm=auto id=auto 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) {
_storm_create(m, m.Option(ice.MSG_RIVER), m.Option("type"), m.Option("name"), m.Option("text"))
}},
mdb.INSERT: {Name: "insert storm 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(kit.MDB_HASH)), mdb.LIST, arg)
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) {
m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), m.Option("storm"), func(key string, value map[string]interface{}) {
switch arg[0] {
case kit.MDB_TIME, kit.MDB_ID:
return
}
if m.Option(kit.MDB_ID) == "" {
m.Log_MODIFY(RIVER, m.Option(ice.MSG_RIVER), arg[0], arg[1], "old", kit.Value(value, kit.Keys(kit.MDB_META, arg[0])))
kit.Value(value, kit.Keys(kit.MDB_META, arg[0]), arg[1])
return
}
m.Grows(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, key), kit.MDB_ID, m.Option(kit.MDB_ID), func(index int, value map[string]interface{}) {
m.Log_MODIFY(RIVER, m.Option(ice.MSG_RIVER), arg[0], arg[1], "old", kit.Value(value, kit.Keys(kit.MDB_META, arg[0])))
kit.Value(value, kit.Keys(kit.MDB_META, arg[0]), arg[1])
})
})
})
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(kit.MDB_HASH)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg)
} 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)
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) {
m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
value = value[kit.MDB_META].(map[string]interface{})
m.Push("time", value[kit.MDB_TIME])
m.Push("storm", key)
m.Push("name", value[kit.MDB_NAME])
m.Push("count", value[kit.MDB_COUNT])
})
})
return
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)
} else {
m.Option(mdb.FIELDS, "time,id,ctx,cmd,help")
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.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) {
if len(arg) == 1 {
m.Grows(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), "", "", func(index int, value map[string]interface{}) {
value = value[kit.MDB_META].(map[string]interface{})
m.Push("time", value[kit.MDB_TIME])
m.Push("id", value[kit.MDB_ID])
m.Push("ctx", value["ctx"])
m.Push("cmd", value["cmd"])
})
return
}
m.Grows(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), kit.MDB_ID, arg[1], func(index int, value map[string]interface{}) {
value = value[kit.MDB_META].(map[string]interface{})
m.Push("detail", value)
})
m.PushAction("删除")
}},
NODE: {Name: "node hash=auto auto 添加 启动", Help: "设备", Action: map[string]*ice.Action{
"start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("web.code.install", "contexts", "base")
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.ROUTE)
}},
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))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, "time,hash,route")
m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH)
m.Table(func(index int, value map[string]string, head []string) {
m.Push(kit.MDB_LINK, kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value["route"])))
})
m.PushAction("删除")
}},
USER: {Name: "user hash=auto auto 添加 邀请", Help: "用户", Action: map[string]*ice.Action{
"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)))
m.Cmdy("web.wiki.image", "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER)))
m.Render("")
}},
mdb.INPUTS: {Name: "inputs", 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)
}},
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))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, "time,hash,username")
m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH)
m.Table(func(index int, value map[string]string, head []string) {
m.Push(aaa.USERZONE, aaa.UserZone(m, value[aaa.USERNAME]))
m.Push(aaa.USERNICK, aaa.UserNick(m, value[aaa.USERNAME]))
})
m.PushAction("删除")
}},
"/river": {Name: "/river", Help: "小河流",
@ -237,12 +228,6 @@ func init() {
web.SHARE: {Name: "share name", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_river_share(m, m.Option(ice.MSG_RIVER), arg[0])
}},
USER: {Name: "user user...", Help: "添加用户", Hand: func(m *ice.Message, arg ...string) {
_river_user(m, m.Option(ice.MSG_RIVER), arg...)
}},
NODE: {Name: "node node...", Help: "添加设备", Hand: func(m *ice.Message, arg ...string) {
_river_node(m, m.Option(ice.MSG_RIVER), arg...)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) > 0 && arg[0] == "storm" {
m.Cmdy("/storm", arg[1:])

View File

@ -45,7 +45,7 @@ func init() {
file = kit.Keys(kit.Select("ice", m.Option("name")), goos, arch)
}
if goos == "windows" {
file += ".exe"
// file += ".exe"
}
// 编译参数

View File

@ -456,6 +456,7 @@ func init() {
arg = []string{"", arg[0]}
}
_image_show(m, arg[0], kit.Select(arg[0], arg[1]), arg[2:]...)
m.Render("")
}},
VIDEO: {Name: "video name url", Help: "视频", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 1 {

37
type.go
View File

@ -94,6 +94,10 @@ func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Mess
m.Option("_action", "")
}
m.Log(LOG_CMDS, "%s.%s %d %v %s", c.Name, key, len(arg), arg, kit.FileLine(h.Hand, 3))
for i := 0; i < len(args)-1; i += 2 {
m.Debug("option %v %v", args[i], args[i+1])
m.Option(args[i], args[i+1])
}
h.Hand(m, args...)
return m
}
@ -103,6 +107,9 @@ func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Mess
m.Option("_action", "")
}
m.Log(LOG_CMDS, "%s.%s %d %v %s", c.Name, key, len(arg), arg, kit.FileLine(h.Hand, 3))
for i := 0; i < len(args)-1; i += 2 {
m.Option(args[i], args[i+1])
}
h.Hand(m, args...)
return m
}
@ -111,6 +118,9 @@ func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Mess
if len(arg) > 0 && cmd.Action != nil {
if h, ok := cmd.Action[arg[0]]; ok {
m.Log(LOG_CMDS, "%s.%s %d %v %s", c.Name, key, len(arg), arg, kit.FileLine(h.Hand, 3))
for i := 1; i < len(arg)-1; i += 2 {
m.Option(arg[i], arg[i+1])
}
h.Hand(m, arg[1:]...)
return m
}
@ -161,6 +171,33 @@ func (c *Context) Merge(s *Context, x Server) *Context {
v.Meta = kit.Dict()
}
for k, a := range v.Action {
if a.List == nil {
list := []interface{}{}
for _, v := range kit.Split(kit.Select(k, a.Name), " ", " ")[1:] {
item := kit.Dict(kit.MDB_INPUT, "text", kit.MDB_VALUE, "@key")
ls := kit.Split(v, " ", ":=@")
kit.Value(item, kit.MDB_NAME, ls[0])
for i := 1; i < len(ls); i += 2 {
switch ls[i] {
case ":":
kit.Value(item, kit.MDB_INPUT, ls[i+1])
case "=":
if strings.Contains(ls[i+1], ",") {
kit.Value(item, kit.MDB_INPUT, "select")
kit.Value(item, "values", strings.Split(ls[i+1], ","))
} else {
kit.Value(item, kit.MDB_VALUE, ls[i+1])
}
case "@":
kit.Value(item, kit.MDB_VALUE, "@"+ls[i+1]+"=")
}
}
list = append(list, item)
}
if len(list) > 0 {
a.List = list
}
}
if a.List != nil {
v.Meta[a.Help] = a.List
v.Meta[k] = a.List