From 2e8b5bb803c4a42399e5fce5cd18712a7554fc3e Mon Sep 17 00:00:00 2001 From: shaoying Date: Sun, 25 Apr 2021 08:16:31 +0800 Subject: [PATCH] add cli.qrcode --- base/aaa/sess.go | 8 ++++++++ base/aaa/user.go | 3 +++ base/cli/cli.go | 4 +++- base/cli/python.go | 6 ------ base/cli/qrcode.go | 48 ++++++++++++++++++++++++++++++++++++++++++++- base/cli/system.go | 31 +---------------------------- base/ssh/scripts.go | 3 +-- base/web/render.go | 7 ++----- core/chat/river.go | 9 ++++----- misc.go | 17 ++++++---------- misc/bash/input.go | 2 +- misc/tmux/tmux.go | 5 ++--- 12 files changed, 78 insertions(+), 65 deletions(-) diff --git a/base/aaa/sess.go b/base/aaa/sess.go index 84b92ca4..4a9ddf14 100644 --- a/base/aaa/sess.go +++ b/base/aaa/sess.go @@ -1,6 +1,8 @@ package aaa import ( + "strings" + ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" @@ -41,6 +43,12 @@ func SessCheck(m *ice.Message, sessid string) { func SessCreate(m *ice.Message, username string) string { return m.Option(ice.MSG_SESSID, _sess_create(m, username)) } +func SessIsCli(m *ice.Message) bool { + if m.Option(ice.MSG_USERUA) == "" || strings.Contains(m.Option(ice.MSG_USERUA), "curl") { + return true + } + return false +} const ( IP = "ip" diff --git a/base/aaa/user.go b/base/aaa/user.go index 54084c2d..079c234b 100644 --- a/base/aaa/user.go +++ b/base/aaa/user.go @@ -139,6 +139,9 @@ func init() { _user_search(m, arg[0], arg[1], kit.Select("", arg, 2)) } }}, + "login": {Name: "login", Help: "登录", Hand: func(m *ice.Message, arg ...string) { + m.EchoQRCode("hi") + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Fields(len(arg) == 0, "time,username,userzone,usernick") m.Cmdy(mdb.SELECT, USER, "", mdb.HASH, USERNAME, arg) diff --git a/base/cli/cli.go b/base/cli/cli.go index 3a942dba..b7441684 100644 --- a/base/cli/cli.go +++ b/base/cli/cli.go @@ -96,4 +96,6 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块", }, } -func init() { ice.Index.Register(Index, nil, RUNTIME, SYSTEM, DAEMON, PYTHON, OUTPUT, PROGRESS) } +func init() { + ice.Index.Register(Index, nil, RUNTIME, SYSTEM, DAEMON, QRCODE, PYTHON, OUTPUT, PROGRESS) +} diff --git a/base/cli/python.go b/base/cli/python.go index 904552d5..f4c88c63 100644 --- a/base/cli/python.go +++ b/base/cli/python.go @@ -15,7 +15,6 @@ func init() { PYTHON: {Name: "python", Help: "脚本命令", Value: kit.Data( "python", "python", "source", "http://mirrors.sohu.com/python/3.5.2/Python-3.5.2.tar.xz", - "qrcode", `import pyqrcode; print(pyqrcode.create('%s').terminal(module_color='%s', quiet_zone=1))`, )}, }, Commands: map[string]*ice.Command{ @@ -30,11 +29,6 @@ func init() { m.Cmdy("web.code.install", "start", m.Conf(PYTHON, "meta.source"), "bin/python3") }}, - "qrcode": {Name: "qrcode text color", Help: "安装", Hand: func(m *ice.Message, arg ...string) { - prefix := []string{SYSTEM, m.Conf(PYTHON, "meta.python")} - m.Cmdy(prefix, "-c", kit.Format(m.Conf(PYTHON, "meta.qrcode"), - kit.Select("hello world", m.Option("text")), kit.Select("blue", m.Option("color")))) - }}, "pip": {Name: "pip", Help: "安装", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(SYSTEM, m.Conf(PYTHON, "meta.pip"), "install", arg) }}, diff --git a/base/cli/qrcode.go b/base/cli/qrcode.go index b068f4f0..9f6a0aff 100644 --- a/base/cli/qrcode.go +++ b/base/cli/qrcode.go @@ -1,17 +1,63 @@ package cli import ( + "bytes" + "encoding/base64" + qrcodeTerminal "github.com/Baozisoftware/qrcode-terminal-go" + "github.com/skip2/go-qrcode" + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/aaa" kit "github.com/shylinux/toolkits" ) +func _qrcode_cli(m *ice.Message, arg ...string) { + fg := qrcodeTerminal.ConsoleColors.BrightBlue + bg := qrcodeTerminal.ConsoleColors.BrightWhite + switch m.Option("fg") { + case "black": + fg = qrcodeTerminal.ConsoleColors.BrightBlack + case "red": + fg = qrcodeTerminal.ConsoleColors.BrightRed + case "green": + fg = qrcodeTerminal.ConsoleColors.BrightGreen + case "yellow": + fg = qrcodeTerminal.ConsoleColors.BrightYellow + case "blue": + fg = qrcodeTerminal.ConsoleColors.BrightBlue + case "cyan": + fg = qrcodeTerminal.ConsoleColors.BrightCyan + case "magenta": + fg = qrcodeTerminal.ConsoleColors.BrightMagenta + case "white": + fg = qrcodeTerminal.ConsoleColors.BrightWhite + } + obj := qrcodeTerminal.New2(fg, bg, qrcodeTerminal.QRCodeRecoveryLevels.Medium) + m.Echo("%s", *obj.Get(arg[0])) +} +func _qrcode_web(m *ice.Message, arg ...string) { + buf := bytes.NewBuffer(make([]byte, 0, ice.MOD_BUFS)) + if qr, e := qrcode.New(arg[0], qrcode.Medium); m.Assert(e) { + m.Assert(qr.Write(kit.Int(kit.Select("240", arg, 1)), buf)) + } + src := "data:image/png;base64," + base64.StdEncoding.EncodeToString(buf.Bytes()) + m.Echo(``, src, arg[0], kit.Select("240", arg, 1)) +} + +const QRCODE = "qrcode" + func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ QRCODE: {Name: "qrcode", Help: "二维码", Value: kit.Data()}, }, Commands: map[string]*ice.Command{ - QRCODE: {Name: "qrcode", Help: "二维码", Action: map[string]*ice.Action{}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + QRCODE: {Name: "qrcode text auto", Help: "二维码", Action: map[string]*ice.Action{}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if aaa.SessIsCli(m) { + _qrcode_cli(m, arg...) + return + } + _qrcode_web(m, arg...) }}, }, }) diff --git a/base/cli/system.go b/base/cli/system.go index c30015cb..6de7a08e 100644 --- a/base/cli/system.go +++ b/base/cli/system.go @@ -1,7 +1,6 @@ package cli import ( - qrcodeTerminal "github.com/Baozisoftware/qrcode-terminal-go" ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" @@ -82,9 +81,6 @@ const ( CMD_CODE = "cmd_code" ) -const ( - QRCODE = "qrcode" -) const SYSTEM = "system" func init() { @@ -93,32 +89,7 @@ func init() { SYSTEM: {Name: SYSTEM, Help: "系统命令", Value: kit.Data()}, }, Commands: map[string]*ice.Command{ - SYSTEM: {Name: "system id auto", Help: "系统命令", Action: map[string]*ice.Action{ - QRCODE: {Name: "qrcode text fg bg lv", Help: "二维码", Hand: func(m *ice.Message, arg ...string) { - fg := qrcodeTerminal.ConsoleColors.BrightBlue - bg := qrcodeTerminal.ConsoleColors.BrightWhite - switch m.Option("fg") { - case "black": - fg = qrcodeTerminal.ConsoleColors.BrightBlack - case "red": - fg = qrcodeTerminal.ConsoleColors.BrightRed - case "green": - fg = qrcodeTerminal.ConsoleColors.BrightGreen - case "yellow": - fg = qrcodeTerminal.ConsoleColors.BrightYellow - case "blue": - fg = qrcodeTerminal.ConsoleColors.BrightBlue - case "cyan": - fg = qrcodeTerminal.ConsoleColors.BrightCyan - case "magenta": - fg = qrcodeTerminal.ConsoleColors.BrightMagenta - case "white": - fg = qrcodeTerminal.ConsoleColors.BrightWhite - } - obj := qrcodeTerminal.New2(fg, bg, qrcodeTerminal.QRCodeRecoveryLevels.Medium) - m.Echo("%s", *obj.Get(m.Option(kit.MDB_TEXT))) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + SYSTEM: {Name: "system id auto", Help: "系统命令", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { if len(arg) == 0 || kit.Int(arg[0]) > 0 { m.Option("_control", "_page") diff --git a/base/ssh/scripts.go b/base/ssh/scripts.go index 12458529..722f72b9 100644 --- a/base/ssh/scripts.go +++ b/base/ssh/scripts.go @@ -3,7 +3,6 @@ package ssh import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" - "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/nfs" kit "github.com/shylinux/toolkits" @@ -25,7 +24,7 @@ func Render(msg *ice.Message, cmd string, args ...interface{}) { fmt.Fprint(msg.O, msg.Result()) case ice.RENDER_QRCODE: - fmt.Fprint(msg.O, msg.Cmdx(cli.PYTHON, "qrcode", kit.Format(args[0], args[1:]...))) + fmt.Fprint(msg.O, msg.Cmdx("cli.qrcode", kit.Format(args[0], args[1:]...))) case ice.RENDER_DOWNLOAD: if f, e := os.Open(arg[0]); e == nil { diff --git a/base/web/render.go b/base/web/render.go index 2263fe6e..fd819f62 100644 --- a/base/web/render.go +++ b/base/web/render.go @@ -4,7 +4,6 @@ import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" kit "github.com/shylinux/toolkits" - "github.com/skip2/go-qrcode" "fmt" "net/http" @@ -48,10 +47,8 @@ func Render(msg *ice.Message, cmd string, args ...interface{}) { } case ice.RENDER_QRCODE: // text [size] - if qr, e := qrcode.New(arg[0], qrcode.Medium); msg.Assert(e) { - msg.W.Header().Set(ContentType, ContentPNG) - msg.Assert(qr.Write(kit.Int(kit.Select("256", arg, 1)), msg.W)) - } + msg.W.Header().Set(ContentType, ContentPNG) + fmt.Fprint(msg.W, msg.Cmdx("cli.qrcode", arg)) case ice.RENDER_RESULT: if len(arg) > 0 { // [str [arg...]] diff --git a/core/chat/river.go b/core/chat/river.go index a5b1bde4..daf26c2a 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -8,7 +8,6 @@ import ( "github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/core/code" - "github.com/shylinux/icebergs/core/wiki" kit "github.com/shylinux/toolkits" ) @@ -110,8 +109,8 @@ func init() { m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), AUTH), mdb.HASH, kit.MDB_HASH, arg) m.PushAction(mdb.REMOVE) if len(arg) > 0 { - m.Push("qrcode", m.Cmdx(wiki.IMAGE, "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), web.SHARE, m.Option("share")))) - m.Push("inner", m.Cmdx(wiki.SPARK, "inner", kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), web.SHARE, m.Option("share")))) + m.PushQRCode("qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), web.SHARE, m.Option("share"))) + m.PushScript("script", kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), web.SHARE, m.Option("share"))) } }}, NODE: {Name: "node name ctx cmd auto insert invite", Help: "设备", Action: map[string]*ice.Action{ @@ -246,8 +245,8 @@ func init() { USER: {Name: "user username auto insert invite", Help: "用户", Action: map[string]*ice.Action{ aaa.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { share := m.Option(web.SHARE, m.Cmdx(m.Prefix(AUTH), mdb.CREATE, kit.MDB_TYPE, USER)) - m.Cmdy(wiki.SPARK, "inner", kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), web.SHARE, share)) - m.Cmdy(wiki.IMAGE, "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), web.SHARE, share)) + m.EchoScript(kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), web.SHARE, share)) + m.EchoQRCode(kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), web.SHARE, share)) m.Render("") }}, mdb.INSERT: {Name: "insert username", Help: "添加", Hand: func(m *ice.Message, arg ...string) { diff --git a/misc.go b/misc.go index edfbc203..b1e83664 100644 --- a/misc.go +++ b/misc.go @@ -1,16 +1,12 @@ package ice import ( - kit "github.com/shylinux/toolkits" - - "bytes" - "encoding/base64" "fmt" "net/url" "path" "strings" - "github.com/skip2/go-qrcode" + kit "github.com/shylinux/toolkits" ) func (m *Message) Prefix(arg ...string) string { @@ -115,6 +111,10 @@ func (m *Message) PushSearchWeb(cmd string, name string) { func Render(m *Message, cmd string, args ...interface{}) string { if m.Option(MSG_USERUA) == "" || strings.Contains(m.Option(MSG_USERUA), "curl") { + switch arg := kit.Simple(args...); cmd { + case RENDER_QRCODE: // text [size] + return m.Cmdx("cli.qrcode", arg[0]) + } return "" } @@ -150,12 +150,7 @@ func Render(m *Message, cmd string, args ...interface{}) string { return fmt.Sprintf(`