diff --git a/base/aaa/user.go b/base/aaa/user.go index f81e6f5e..06069001 100644 --- a/base/aaa/user.go +++ b/base/aaa/user.go @@ -32,8 +32,8 @@ func _user_modify(m *ice.Message, name string, arg ...string) { } m.Richs(USER, nil, name, func(key string, value map[string]interface{}) { + m.Log_MODIFY(USERNAME, name, arg) for i := 0; i < len(arg)-1; i += 2 { - m.Log_MODIFY(USERNAME, name, arg[i], arg[i+1]) kit.Value(value, arg[i], arg[i+1]) } }) diff --git a/base/web/render.go b/base/web/render.go index a6896a8c..9f8332bb 100644 --- a/base/web/render.go +++ b/base/web/render.go @@ -106,11 +106,13 @@ var RENDER = struct { A string IMG string Field string + Frame string Button string }{ A: "a", IMG: "img", Field: "field", + Frame: "frame", Button: "button", } @@ -119,7 +121,8 @@ func init() { Commands: map[string]*ice.Command{ "_render": {Action: map[string]*ice.Action{ RENDER.A: {Hand: func(m *ice.Message, arg ...string) { - u := kit.Select(m.Conf(SHARE, "meta.domain"), arg, 1) + // u := kit.Select(m.Conf(SHARE, "meta.domain"), arg, 1) + u := kit.Select(arg[0], arg, 1) m.Echo(`%s`, u, arg[0]) }}, RENDER.IMG: {Hand: func(m *ice.Message, arg ...string) { @@ -128,6 +131,9 @@ func init() { RENDER.Field: {Hand: func(m *ice.Message, arg ...string) { m.Echo(`
`, arg[0], arg[1]) }}, + RENDER.Frame: {Hand: func(m *ice.Message, arg ...string) { + m.Echo(``, arg[0]) + }}, RENDER.Button: {Hand: func(m *ice.Message, arg ...string) { m.Echo(``, arg[0]) }}, diff --git a/core/chat/chat.go b/core/chat/chat.go index 03b30169..a3b4a7db 100644 --- a/core/chat/chat.go +++ b/core/chat/chat.go @@ -85,8 +85,8 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", }}, web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(ice.MSG_RIVER, "") - m.Option(ice.MSG_STORM, "") + m.Option(ice.MSG_RIVER, m.Option("river")) + m.Option(ice.MSG_STORM, m.Option("storm")) if len(arg) > 0 { switch arg[0] { diff --git a/core/chat/location.go b/core/chat/location.go new file mode 100644 index 00000000..5fe51d32 --- /dev/null +++ b/core/chat/location.go @@ -0,0 +1,102 @@ +package chat + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" + + "net/url" + "strings" +) + +const ( + LOCATION = "location" + LONGITUDE = "longitude" + LATITUDE = "latitude" +) + +func init() { + Index.Register(&ice.Context{Name: LOCATION, Help: "地理位置", + Configs: map[string]*ice.Config{ + LOCATION: {Name: "location", Help: "地理位置", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TEXT)}, + }, + Commands: map[string]*ice.Command{ + ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Load(LOCATION) + m.Cmd(mdb.SEARCH, mdb.CREATE, LOCATION, m.Prefix(LOCATION)) + m.Cmd(mdb.RENDER, mdb.CREATE, LOCATION, m.Prefix(LOCATION)) + }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save(LOCATION) }}, + + LOCATION: {Name: "location text auto 添加:button", Help: "地理位置", Action: map[string]*ice.Action{ + mdb.INSERT: {Hand: func(m *ice.Message, arg ...string) { + m.Conf(LOCATION, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM), kit.MDB_META, kit.MDB_SHORT), kit.MDB_TEXT) + + h := m.Rich(LOCATION, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), kit.Dict( + kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, arg[2], + LONGITUDE, arg[3], LATITUDE, arg[4], + )) + m.Log_INSERT(LOCATION, arg[2]) + m.Echo(h) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Richs(LOCATION, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), m.Option(kit.MDB_TEXT), func(key string, value map[string]interface{}) { + if arg[0] == kit.MDB_TEXT { + return + } + m.Log_MODIFY(PASTE, m.Option(kit.MDB_TEXT)) + value[arg[0]] = arg[1] + }) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Richs(LOCATION, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), m.Option(kit.MDB_TEXT), func(key string, value map[string]interface{}) { + m.Log_REMOVE(LOCATION, m.Option(kit.MDB_TEXT)) + m.Conf(LOCATION, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM), kit.MDB_HASH, key), "") + }) + }}, + mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { + m.Richs(LOCATION, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), kit.MDB_FOREACH, func(key string, value map[string]interface{}) { + if strings.Contains(kit.Format(value[kit.MDB_NAME]), arg[1]) || + strings.Contains(kit.Format(value[kit.MDB_TEXT]), arg[1]) { + + m.Push("pod", m.Option("pod")) + m.Push("ctx", m.Cap(ice.CTX_FOLLOW)) + m.Push("cmd", LOCATION) + m.Push(kit.MDB_TIME, value["time"]) + m.Push(kit.MDB_SIZE, value["size"]) + m.Push(kit.MDB_TYPE, LOCATION) + m.Push(kit.MDB_NAME, value["name"]) + m.Push(kit.MDB_TEXT, value["text"]) + } + }) + }}, + mdb.RENDER: {Name: "render type name text", Help: "渲染", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.RENDER, web.RENDER.Frame, kit.Format( + "https://map.baidu.com/search/%s/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd=%s", + arg[2], arg[2])) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Richs(LOCATION, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), kit.Select(kit.MDB_FOREACH, arg, 0), func(key string, value map[string]interface{}) { + if len(arg) == 0 { + m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT, + LONGITUDE, LATITUDE}) + if strings.Contains(m.Option(ice.MSG_USERUA), "MicroMessenger") { + return + } + m.Push("action", m.Cmdx(mdb.RENDER, web.RENDER.Button, "删除")) + loc := m.Cmdx(mdb.RENDER, web.RENDER.A, "百度地图", kit.Format( + "https://map.baidu.com/search/%s/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd=%s", + url.QueryEscape(kit.Format(value[kit.MDB_TEXT])), + url.QueryEscape(kit.Format(value[kit.MDB_TEXT])), + )) + m.Push("location", loc) + return + } + m.Push("detail", value) + }) + m.Sort("time", "time_r") + }}, + }, + }, nil) +} diff --git a/core/chat/paste.go b/core/chat/paste.go new file mode 100644 index 00000000..8838c61e --- /dev/null +++ b/core/chat/paste.go @@ -0,0 +1,91 @@ +package chat + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" + + "strings" +) + +const ( + PASTE = "paste" +) + +func init() { + Index.Register(&ice.Context{Name: PASTE, Help: "粘贴板", + Configs: map[string]*ice.Config{ + PASTE: {Name: "paste", Help: "粘贴板", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TEXT)}, + }, + Commands: map[string]*ice.Command{ + ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Load(PASTE) + m.Cmd(mdb.SEARCH, mdb.CREATE, PASTE, m.Prefix(PASTE)) + m.Cmd(mdb.RENDER, mdb.CREATE, PASTE, m.Prefix(PASTE)) + }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Save(PASTE) + }}, + + PASTE: {Name: "paste text auto 添加:button", Help: "粘贴板", Action: map[string]*ice.Action{ + mdb.INSERT: {Hand: func(m *ice.Message, arg ...string) { + m.Conf(PASTE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM), kit.MDB_META, kit.MDB_SHORT), kit.MDB_TEXT) + + h := m.Rich(PASTE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), kit.Dict( + kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, strings.TrimSpace(arg[2]), + )) + m.Log_INSERT(PASTE, arg[2]) + m.Echo(h) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Richs(PASTE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), m.Option(kit.MDB_TEXT), func(key string, value map[string]interface{}) { + if arg[0] == kit.MDB_TEXT { + return + } + m.Log_MODIFY(PASTE, m.Option(kit.MDB_TEXT)) + value[arg[0]] = arg[1] + }) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Richs(PASTE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), m.Option(kit.MDB_TEXT), func(key string, value map[string]interface{}) { + m.Log_REMOVE(PASTE, m.Option(kit.MDB_TEXT)) + m.Conf(PASTE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM), kit.MDB_HASH, key), "") + }) + }}, + mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { + m.Richs(PASTE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), kit.MDB_FOREACH, func(key string, value map[string]interface{}) { + if strings.Contains(kit.Format(value[kit.MDB_NAME]), arg[1]) || + strings.Contains(kit.Format(value[kit.MDB_TEXT]), arg[1]) { + + m.Push("pod", m.Option("pod")) + m.Push("ctx", m.Cap(ice.CTX_FOLLOW)) + m.Push("cmd", PASTE) + m.Push(kit.MDB_TIME, value["time"]) + m.Push(kit.MDB_SIZE, value["size"]) + m.Push(kit.MDB_TYPE, PASTE) + m.Push(kit.MDB_NAME, value["name"]) + m.Push(kit.MDB_TEXT, value["text"]) + } + }) + }}, + mdb.RENDER: {Name: "render type name text", Help: "渲染", Hand: func(m *ice.Message, arg ...string) { + m.Echo(arg[2]) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Richs(PASTE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), kit.Select(kit.MDB_FOREACH, arg, 0), func(key string, value map[string]interface{}) { + if len(arg) == 0 { + m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT}) + if strings.Contains(m.Option(ice.MSG_USERUA), "MicroMessenger") { + return + } + m.Push("action", m.Cmdx(mdb.RENDER, web.RENDER.Button, "删除")) + return + } + m.Push("detail", value) + }) + m.Sort("time", "time_r") + }}, + }, + }, nil) +} diff --git a/core/chat/qrcode.go b/core/chat/qrcode.go new file mode 100644 index 00000000..e6cc31b9 --- /dev/null +++ b/core/chat/qrcode.go @@ -0,0 +1,93 @@ +package chat + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" + + "strings" +) + +const ( + QRCODE = "qrcode" +) + +func init() { + Index.Register(&ice.Context{Name: QRCODE, Help: "二维码", + Configs: map[string]*ice.Config{ + QRCODE: {Name: "qrcode", Help: "二维码", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TEXT)}, + }, + Commands: map[string]*ice.Command{ + ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Load(QRCODE) + m.Cmd(mdb.SEARCH, mdb.CREATE, QRCODE, m.Prefix(QRCODE)) + m.Cmd(mdb.RENDER, mdb.CREATE, QRCODE, m.Prefix(QRCODE)) + }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Save(QRCODE) + }}, + + QRCODE: {Name: "qrcode text auto 添加:button", Help: "二维码", Action: map[string]*ice.Action{ + mdb.INSERT: {Hand: func(m *ice.Message, arg ...string) { + m.Conf(QRCODE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM), kit.MDB_META, kit.MDB_SHORT), kit.MDB_TEXT) + + h := m.Rich(QRCODE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), kit.Dict( + kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, arg[2], + )) + m.Log_INSERT(QRCODE, arg[2]) + m.Echo(h) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Richs(QRCODE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), m.Option(kit.MDB_TEXT), func(key string, value map[string]interface{}) { + if arg[0] == kit.MDB_TEXT { + return + } + m.Log_MODIFY(PASTE, m.Option(kit.MDB_TEXT)) + value[arg[0]] = arg[1] + }) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Richs(QRCODE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), m.Option(kit.MDB_TEXT), func(key string, value map[string]interface{}) { + m.Log_REMOVE(QRCODE, m.Option(kit.MDB_TEXT)) + m.Conf(QRCODE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM), kit.MDB_HASH, key), "") + }) + }}, + mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { + m.Richs(QRCODE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), kit.MDB_FOREACH, func(key string, value map[string]interface{}) { + if strings.Contains(kit.Format(value[kit.MDB_NAME]), arg[1]) || + strings.Contains(kit.Format(value[kit.MDB_TEXT]), arg[1]) { + + m.Push("pod", m.Option("pod")) + m.Push("ctx", m.Cap(ice.CTX_FOLLOW)) + m.Push("cmd", QRCODE) + m.Push(kit.MDB_TIME, value["time"]) + m.Push(kit.MDB_SIZE, value["size"]) + m.Push(kit.MDB_TYPE, QRCODE) + m.Push(kit.MDB_NAME, value["name"]) + m.Push(kit.MDB_TEXT, value["text"]) + } + }) + }}, + mdb.RENDER: {Name: "render type name text", Help: "渲染", Hand: func(m *ice.Message, arg ...string) { + m.Echo(m.Cmdx("web.wiki.image", "qrcode", arg[2])) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Richs(QRCODE, kit.Keys(kit.MDB_META, m.Option(ice.MSG_RIVER), m.Option(ice.MSG_STORM)), kit.Select(kit.MDB_FOREACH, arg, 0), func(key string, value map[string]interface{}) { + if len(arg) == 0 { + m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT}) + if strings.Contains(m.Option(ice.MSG_USERUA), "MicroMessenger") { + return + } + m.Push("action", m.Cmdx(mdb.RENDER, web.RENDER.Button, "删除")) + img := m.Cmdx("web.wiki.image", "qrcode", value[kit.MDB_TEXT]) + m.Push("qrcode", img) + return + } + m.Push("detail", value) + }) + m.Sort("time", "time_r") + }}, + }, + }, nil) +} diff --git a/core/chat/river.go b/core/chat/river.go index 92f9221e..f0a59635 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -124,14 +124,16 @@ func init() { _river_user(m, m.Option(ice.MSG_RIVER), arg...) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmd(aaa.USER, mdb.MODIFY, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK)) if len(arg) > 0 && arg[0] == "storm" { m.Cmdy("/storm", arg[1:]) return } - if m.Option(ice.MSG_SESSID) == "" { + if m.Option("_source") == "" && m.Option(ice.MSG_SESSID) == "" { m.Render("status", "401") return } + _river_list(m) }}, }, diff --git a/init.go b/init.go index 0a8962fc..58fbeb95 100644 --- a/init.go +++ b/init.go @@ -59,6 +59,7 @@ func (f *Frame) Close(m *Message, arg ...string) bool { return true } +var wait = make(chan bool, 1) var Index = &Context{Name: "ice", Help: "冰山模块", Caches: map[string]*Cache{ CTX_FOLLOW: {Value: ""}, @@ -133,6 +134,7 @@ var Index = &Context{Name: "ice", Help: "冰山模块", }) } }) + wait <- true }}, }, } @@ -176,6 +178,7 @@ func Run(arg ...string) string { Pulse.Table(nil) } fmt.Printf(Pulse.Result()) + <-wait os.Exit(frame.code) return "" } diff --git a/misc/mp/mp.shy b/misc/mp/mp.shy index d9785cae..9507214d 100644 --- a/misc/mp/mp.shy +++ b/misc/mp/mp.shy @@ -7,6 +7,10 @@ refer "" ` ` chapter "应用" +field "user" user +field "qrcode" web.chat.qrcode.qrcode +field "qrcode" web.chat.qrcode.qrcode args `[ insert qrcode hi hello ]` + section "二维码" field "qrcode 源码" web.code.inner args `[ usr/icebergs core/code/qrcode.go 1 ]`