From 8c9c34ef35192a5c38c8328b3a396732c222e3a6 Mon Sep 17 00:00:00 2001 From: shylinux Date: Wed, 22 Jul 2020 01:43:10 +0800 Subject: [PATCH] opt lark --- core/chat/river.go | 6 +- misc/lark/lark.go | 434 ++++++++++++++++++++++----------------------- 2 files changed, 209 insertions(+), 231 deletions(-) diff --git a/core/chat/river.go b/core/chat/river.go index 1d0e55fe..49711965 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -50,7 +50,7 @@ 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) + _river_user(m, h, cli.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) { @@ -85,14 +85,10 @@ func init() { ), ), aaa.Black, kit.Dict(aaa.TECH, []interface{}{ - "/river.create", "/river.rename", "/river.remove", - "/river.share", - "/storm.share", "/storm.remove", "/storm.rename", - "/storm.create", }), aaa.White, kit.Dict(aaa.VOID, []interface{}{ "/header", diff --git a/misc/lark/lark.go b/misc/lark/lark.go index 083a5f36..d047338a 100644 --- a/misc/lark/lark.go +++ b/misc/lark/lark.go @@ -16,6 +16,12 @@ import ( "time" ) +func raw(m *ice.Message, url string, arg ...interface{}) interface{} { + m.Option("header", "Authorization", "Bearer "+m.Cmdx(APP, "token", "bot"), "Content-Type", "application/json") + data := kit.UnMarshal(m.Cmdx(web.SPIDE, LARK, "raw", http.MethodGet, url, arg)) + m.Debug(kit.Formats(data)) + return data +} func post(m *ice.Message, bot string, arg ...interface{}) { m.Richs(APP, nil, bot, func(key string, value map[string]interface{}) { m.Option("header", "Authorization", "Bearer "+m.Cmdx(APP, "token", bot), "Content-Type", "application/json") @@ -44,21 +50,19 @@ func parse(m *ice.Message) { } } } - if kit.Fetch(kit.Value(data, "action.value"), func(key string, value string) { - m.Add("option", key, value) - }) != nil { - m.Option("msg.type", "event_click") - } m.Info("msg: %v", kit.Formats(data)) } const ( - P2P_CHAT_CREATE = "p2p_chat_create" ADD_BOT = "add_bot" + P2P_CHAT_CREATE = "p2p_chat_create" ) const ( - OPEN_CHAT_ID = "open_chat_id" + SHIP_ID = "ship_id" + OPEN_ID = "open_id" + CHAT_ID = "chat_id" USER_OPEN_ID = "user_open_id" + OPEN_CHAT_ID = "open_chat_id" ) const ( APP = "app" @@ -69,20 +73,22 @@ const ( FORM = "form" DUTY = "duty" TALK = "talk" - - RAND = "rand" + RAND = "rand" + HOME = "home" LARK = "lark" ) var Index = &ice.Context{Name: "lark", Help: "机器人", Configs: map[string]*ice.Config{ - APP: &ice.Config{Name: APP, Help: "服务配置", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME, + APP: {Name: APP, Help: "服务配置", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME, LARK, "https://open.feishu.cn", DUTY, "", "welcome", kit.Dict( - P2P_CHAT_CREATE, "让我们做好朋友吧~", ADD_BOT, "我来也~", + ADD_BOT, "我来也~", P2P_CHAT_CREATE, "让我们做好朋友吧~", ), )}, - USER: &ice.Config{Name: USER, Help: "用户配置", Value: kit.Data()}, + SHIP: {Name: SHIP, Help: "组织配置", Value: kit.Data(kit.MDB_SHORT, SHIP_ID)}, + USER: {Name: USER, Help: "用户配置", Value: kit.Data(kit.MDB_SHORT, OPEN_ID)}, + HOME: {Name: HOME, Help: "卡片配置", Value: kit.Data(kit.MDB_SHORT, OPEN_ID)}, }, Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { @@ -91,7 +97,7 @@ var Index = &ice.Context{Name: "lark", Help: "机器人", m.Cmd(DUTY, "boot", m.Conf(cli.RUNTIME, "boot.hostname"), m.Time()) }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Save(APP, USER) + m.Save(APP, SHIP, USER) }}, APP: {Name: "app [name] auto", Help: "应用", Action: map[string]*ice.Action{ @@ -102,18 +108,13 @@ var Index = &ice.Context{Name: "lark", Help: "机器人", m.Richs(APP, nil, arg[0], func(key string, value map[string]interface{}) { if now := time.Now().Unix(); kit.Format(value["token"]) == "" || kit.Int64(value["expire"]) < now { m.Cmdy(web.SPIDE, LARK, "/open-apis/auth/v3/tenant_access_token/internal/", "app_id", value["id"], "app_secret", value["mm"]) - value["token"] = m.Append("tenant_access_token") value["expire"] = kit.Int64(m.Append("expire")) + now - m.Set("result") + value["token"] = m.Append("tenant_access_token") + m.Set(ice.MSG_RESULT) } m.Echo("%s", value["token"]) }) }}, - "watch": {Name: "watch user title text event...", Hand: func(m *ice.Message, arg ...string) { - for _, v := range arg[2:] { - m.Watch(v, m.Prefix("send"), arg[0], arg[1], v) - } - }}, }, Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { m.Richs(APP, nil, kit.Select(kit.MDB_FOREACH, arg, 0), func(key string, value map[string]interface{}) { if len(arg) == 0 || arg[0] == "" { @@ -124,122 +125,121 @@ var Index = &ice.Context{Name: "lark", Help: "机器人", }) }}, SHIP: {Name: "ship ship_id open_id text", Help: "组织", Action: map[string]*ice.Action{ - "user": {Name: "user id", Hand: func(m *ice.Message, arg ...string) { + "info": {Name: "info ship_id", Hand: func(m *ice.Message, arg ...string) { m.Richs(APP, nil, "bot", func(key string, value map[string]interface{}) { - m.Option("header", "Authorization", "Bearer "+m.Cmdx(APP, "token", "bot"), "Content-Type", "application/json") - data := kit.UnMarshal(m.Cmdx(web.SPIDE, LARK, "raw", http.MethodGet, "/open-apis/contact/v1/department/user/list", - "department_id", arg[0], "page_size", "100", "fetch_child", "true")) + data := raw(m, "/open-apis/contact/v1/department/detail/batch_get", + "department_ids", arg[0]) - m.Debug(kit.Formats(data)) - kit.Fetch(kit.Value(data, "data.user_list"), func(index int, value map[string]interface{}) { - msg := m.Cmd(m.Prefix("user"), value["open_id"]) - m.Push("name", msg.Append("name")) - m.Push("open_id", msg.Append("open_id")) - }) - }) - }}, - "info": {Name: "info id", Hand: func(m *ice.Message, arg ...string) { - m.Richs(APP, nil, "bot", func(key string, value map[string]interface{}) { - m.Option("header", "Authorization", "Bearer "+m.Cmdx(APP, "token", "bot"), "Content-Type", "application/json") - data := kit.UnMarshal(m.Cmdx(web.SPIDE, LARK, "raw", http.MethodGet, "/open-apis/contact/v1/department/detail/batch_get", "department_ids", arg[0])) - - m.Debug(kit.Formats(data)) kit.Fetch(kit.Value(data, "data.department_infos"), func(index int, value map[string]interface{}) { m.Push("name", value) }) }) }}, - }, Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { - if len(arg) == 0 { - m.Option("header", "Authorization", "Bearer "+m.Cmdx(APP, "token", "bot"), "Content-Type", "application/json") - data := kit.UnMarshal(m.Cmdx(web.SPIDE, LARK, "raw", http.MethodGet, "/open-apis/contact/v1/scope/get/")) - kit.Fetch(kit.Value(data, "data.authed_departments"), func(index int, value string) { - m.Push("ship_id", value) - msg := m.Cmd(m.Prefix("ship"), "info", value) - m.Push("name", msg.Append("name")) - m.Push("chat_id", msg.Append("chat_id")) - }) - return - } - if len(arg) == 1 { - m.Cmdy(m.Prefix(SHIP), USER, arg[0]) - return - } - - m.Cmdy(m.Prefix(SEND), "open_id", arg[1], arg[2:]) - }}, - USER: {Name: "user code|email|mobile", Help: "用户", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { - if !strings.HasPrefix(arg[0], "ou_") { - us := []string{} - for i := 0; i < len(arg); i++ { - us = append(us, kit.Select("mobiles", "emails", strings.Contains(arg[i], "@")), arg[i]) - } - post(m, "bot", "GET", "/open-apis/user/v1/batch_get_id", us) - for i := 0; i < len(arg); i++ { - m.Echo(m.Append(kit.Keys("data.mobile_users", arg[i], "0.open_id"))) - } - return - } - - m.Richs(APP, nil, "bot", func(key string, value map[string]interface{}) { - m.Option("header", "Authorization", "Bearer "+m.Cmdx(APP, "token", "bot"), "Content-Type", "application/json") - data := kit.UnMarshal(m.Cmdx(web.SPIDE, LARK, "raw", http.MethodGet, "/open-apis/contact/v1/user/batch_get", "open_ids", arg[0])) - - m.Debug(kit.Formats(data)) - kit.Fetch(kit.Value(data, "data.user_infos"), func(index int, value map[string]interface{}) { - m.Push("name", value["name"]) - m.Push("mobile", value["mobile"]) - m.Push("open_id", value["open_id"]) - }) - }) - }}, - GROUP: {Name: "group chat_id open_id text", Help: "群组", Action: map[string]*ice.Action{ - "user": {Name: "user id", Hand: func(m *ice.Message, arg ...string) { + "user": {Name: "user ship_id", Hand: func(m *ice.Message, arg ...string) { m.Richs(APP, nil, "bot", func(key string, value map[string]interface{}) { - m.Option("header", "Authorization", "Bearer "+m.Cmdx(APP, "token", "bot"), "Content-Type", "application/json") - data := kit.UnMarshal(m.Cmdx(web.SPIDE, LARK, "raw", http.MethodGet, "/open-apis/chat/v4/info", "chat_id", arg[0])) + data := raw(m, "/open-apis/contact/v1/department/user/list", + "department_id", arg[0], "page_size", "100", "fetch_child", "true") - m.Debug(kit.Formats(data)) - kit.Fetch(kit.Value(data, "data.members"), func(index int, value map[string]interface{}) { - msg := m.Cmd(m.Prefix("user"), value["open_id"]) - m.Push("name", msg.Append("name")) - m.Push("open_id", msg.Append("open_id")) + kit.Fetch(kit.Value(data, "data.user_list"), func(index int, value map[string]interface{}) { + msg := m.Cmd(m.Prefix(USER), value[OPEN_ID]) + m.Push("avatar", m.Cmdx(mdb.RENDER, web.RENDER.IMG, msg.Append("avatar_72"))) + m.Push("gender", kit.Select("男", "女", msg.Append("gender") == "1")) + m.Push(kit.MDB_NAME, msg.Append(kit.MDB_NAME)) + m.Push("description", msg.Append("description")) + m.Push(OPEN_ID, msg.Append(OPEN_ID)) }) }) }}, }, Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { if len(arg) == 0 { + // 组织列表 + data := raw(m, "/open-apis/contact/v1/scope/get/") + kit.Fetch(kit.Value(data, "data.authed_departments"), func(index int, value string) { + m.Push(SHIP_ID, value) + msg := m.Cmd(m.Prefix(SHIP), "info", value) + m.Push(kit.MDB_NAME, msg.Append(kit.MDB_NAME)) + m.Push("member_count", msg.Append("member_count")) + m.Push(CHAT_ID, msg.Append(CHAT_ID)) + }) + m.Sort(kit.MDB_NAME) + return + } + if len(arg) == 1 { + // 用户列表 + m.Cmdy(m.Prefix(SHIP), USER, arg[0]) + return + } + // 用户通知 + m.Cmdy(m.Prefix(SEND), OPEN_ID, arg[1], arg[2:]) + }}, + USER: {Name: "user open_id|mobile|email", Help: "用户", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + if strings.HasPrefix(arg[0], "ou_") { m.Richs(APP, nil, "bot", func(key string, value map[string]interface{}) { - m.Option("header", "Authorization", "Bearer "+m.Cmdx(APP, "token", "bot"), "Content-Type", "application/json") - data := kit.UnMarshal(m.Cmdx(web.SPIDE, LARK, "raw", http.MethodGet, "/open-apis/chat/v4/list")) - kit.Fetch(kit.Value(data, "data.groups"), func(index int, value map[string]interface{}) { - m.Push("chat_id", value["chat_id"]) - m.Push("name", value["name"]) - m.Push("description", value["description"]) - m.Push("open_id", value["owner_open_id"]) + data := raw(m, "/open-apis/contact/v1/user/batch_get", "open_ids", arg[0]) + kit.Fetch(kit.Value(data, "data.user_infos"), func(index int, value map[string]interface{}) { + m.Push("name", value) }) }) return } + + us := []string{} + for i := 0; i < len(arg); i++ { + us = append(us, kit.Select("mobiles", "emails", strings.Contains(arg[i], "@")), arg[i]) + } + post(m, "bot", http.MethodGet, "/open-apis/user/v1/batch_get_id", us) + for i := 0; i < len(arg); i++ { + m.Echo(m.Append(kit.Keys("data.mobile_users", arg[i], "0.open_id"))) + } + }}, + GROUP: {Name: "group chat_id open_id text", Help: "群组", Action: map[string]*ice.Action{ + "user": {Name: "user id", Hand: func(m *ice.Message, arg ...string) { + m.Richs(APP, nil, "bot", func(key string, value map[string]interface{}) { + data := raw(m, "/open-apis/chat/v4/info", "chat_id", arg[0]) + + kit.Fetch(kit.Value(data, "data.members"), func(index int, value map[string]interface{}) { + msg := m.Cmd(m.Prefix(USER), value[OPEN_ID]) + m.Push("avatar", m.Cmdx(mdb.RENDER, web.RENDER.IMG, msg.Append("avatar_72"))) + m.Push("gender", kit.Select("男", "女", msg.Append("gender") == "2")) + m.Push(kit.MDB_NAME, msg.Append(kit.MDB_NAME)) + m.Push("description", msg.Append("description")) + m.Push(OPEN_ID, msg.Append(OPEN_ID)) + }) + }) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + if len(arg) == 0 { + // 群组列表 + m.Richs(APP, nil, "bot", func(key string, value map[string]interface{}) { + m.Option("header", "Authorization", "Bearer "+m.Cmdx(APP, "token", "bot"), "Content-Type", "application/json") + data := raw(m, "/open-apis/chat/v4/list") + kit.Fetch(kit.Value(data, "data.groups"), func(index int, value map[string]interface{}) { + m.Push(CHAT_ID, value[CHAT_ID]) + m.Push("avatar", m.Cmdx(mdb.RENDER, web.RENDER.IMG, value["avatar"])) + m.Push(kit.MDB_NAME, value[kit.MDB_NAME]) + m.Push("description", value["description"]) + m.Push(OPEN_ID, value["owner_open_id"]) + }) + }) + m.Sort(kit.MDB_NAME) + return + } if len(arg) == 1 { + // 用户列表 m.Cmdy(m.Prefix(GROUP), USER, arg[0]) return } - m.Cmdy(m.Prefix(SEND), "chat_id", arg[0], arg[2:]) - }}, - RAND: {Name: "rand", Help: "随机", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { - msg := m.Cmd(GROUP, "user", m.Option(OPEN_CHAT_ID)) - list := msg.Appendv("name") - m.Echo(list[rand.Intn(len(list))]) + // 用户通知 + m.Cmdy(m.Prefix(SEND), CHAT_ID, arg[0], arg[2:]) }}, SEND: {Name: "send [chat_id|open_id|user_id|email] user [title] text", Help: "消息", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { var form = kit.Dict("content", kit.Dict()) switch arg[0] { - case "chat_id", "open_id", "user_id", "email": + case CHAT_ID, OPEN_ID, "user_id", "email": form[arg[0]], arg = arg[1], arg[2:] default: - form["chat_id"], arg = arg[0], arg[1:] + form[CHAT_ID], arg = arg[0], arg[1:] } switch len(arg) { @@ -247,10 +247,13 @@ var Index = &ice.Context{Name: "lark", Help: "机器人", case 1: kit.Value(form, "msg_type", "text") kit.Value(form, "content.text", arg[0]) - if arg[0] == "" { + if strings.TrimSpace(arg[0]) == "" { return } default: + if len(arg) == 2 && strings.TrimSpace(arg[1]) == "" { + return + } content := []interface{}{} line := []interface{}{} for _, v := range arg[1:] { @@ -275,14 +278,15 @@ var Index = &ice.Context{Name: "lark", Help: "机器人", post(m, "bot", "/open-apis/message/v4/send/", "data", kit.Formats(form)) }}, - DUTY: {Name: "send [title] text", Help: "通告", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { - m.Cmdy(SEND, m.Conf(APP, "meta.duty"), arg) - }}, TALK: {Name: "talk text", Help: "聊天", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { cmd := kit.Split(arg[0]) + if len(cmd) == 0 { + m.Cmd(HOME) + return + } // 用户权限 - m.Option(ice.MSG_USERNAME, m.Option("open_id")) + m.Option(ice.MSG_USERNAME, m.Option(OPEN_ID)) m.Option(ice.MSG_USERROLE, aaa.UserRole(m, m.Option(ice.MSG_USERNAME))) m.Info("%s: %s", m.Option(ice.MSG_USERROLE), m.Option(ice.MSG_USERNAME)) @@ -295,15 +299,11 @@ var Index = &ice.Context{Name: "lark", Help: "机器人", if !m.Right(cmd) { // 没有权限 m.Cmd(DUTY, m.Option(OPEN_CHAT_ID), m.Option("text_without_at_bot")) - m.Cmd("home") + m.Cmd(HOME) return } } - if len(cmd) == 0 { - m.Cmd("home") - return - } // 执行命令 msg := m.Cmd(cmd) if m.Hand = false; !msg.Hand { @@ -312,17 +312,102 @@ var Index = &ice.Context{Name: "lark", Help: "机器人", if m.Hand = true; msg.Result() == "" { msg.Table() } - if m.Hand = true; msg.Result() == "" { - m.Cmd("home") + m.Echo(msg.Result()) + }}, + DUTY: {Name: "duty [title] text", Help: "通告", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + m.Cmdy(SEND, m.Conf(APP, "meta.duty"), arg) + }}, + RAND: {Name: "rand", Help: "随机", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + msg := m.Cmd(GROUP, "user", m.Option(OPEN_CHAT_ID)) + list := msg.Appendv("name") + if strings.Contains(m.Option("content"), "誰") { + m.Echo(strings.Replace(m.Option("content"), "誰", list[rand.Intn(len(list))], 1)) return } - m.Echo(msg.Result()) + m.Echo(list[rand.Intn(len(list))]) + }}, + HOME: {Name: "home", Help: "首页", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + m.Cmd(FORM, CHAT_ID, m.Option(OPEN_CHAT_ID), HOME, "应用列表", + "官网首页", "url", "https://shylinux.com", + "群里誰最帅", "cmd", "rand", + "群里誰最美", "cmd", "rand", + "date", "cmd", "date", + "pwd", "cmd", "pwd", + ) + }}, + FORM: {Name: "form chat_id|open_id|user_id|email user title [text [confirm|value|url arg...]]...", Help: "消息", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + var form = map[string]interface{}{"content": map[string]interface{}{}} + switch arg[0] { + case CHAT_ID, OPEN_ID, "user_id", "email": + form[arg[0]], arg = arg[1], arg[2:] + default: + form[CHAT_ID], arg = arg[0], arg[1:] + } + + elements := []interface{}{} + elements = append(elements, map[string]interface{}{ + "tag": "div", "text": map[string]interface{}{ + "tag": "plain_text", "content": arg[1], + }, + }) + + actions := []interface{}{} + for i := 2; i < len(arg); i++ { + button := map[string]interface{}{ + "tag": "button", "text": map[string]interface{}{ + "tag": "plain_text", "content": arg[i], + }, + "type": "default", + } + + content := arg[i] + switch arg[i+1] { + case "confirm": + button[arg[i+1]], i = map[string]interface{}{ + "title": map[string]interface{}{"tag": "lark_md", "content": arg[i+2]}, + "text": map[string]interface{}{"tag": "lark_md", "content": arg[i+3]}, + }, i+3 + case "value": + button[arg[i+1]], i = map[string]interface{}{ + arg[i+2]: arg[i+3], + }, i+3 + case "url": + button[arg[i+1]], i = arg[i+2], i+2 + default: + button["value"], i = map[string]interface{}{ + arg[i+1]: arg[i+2], + }, i+2 + } + kit.Value(button, "value.content", content) + kit.Value(button, "value.open_chat_id", m.Option(OPEN_CHAT_ID)) + kit.Value(button, "value.description", arg[1]) + kit.Value(button, "value.title", arg[0]) + + actions = append(actions, button) + } + elements = append(elements, map[string]interface{}{ + "tag": "action", "actions": actions, + }) + + kit.Value(form, "msg_type", "interactive") + kit.Value(form, "card", map[string]interface{}{ + "config": map[string]interface{}{ + "wide_screen_mode": true, + }, + "header": map[string]interface{}{ + "title": map[string]interface{}{ + "tag": "lark_md", "content": arg[0], + }, + }, + "elements": elements, + }) + + post(m, "bot", "/open-apis/message/v4/send/", "data", kit.Formats(form)) }}, web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, "/msg": {Name: "/msg", Help: "聊天消息", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { - data := m.Optionv(ice.MSG_USERDATA) - if kit.Value(data, "action.tag") == "button" { + if data := m.Optionv(ice.MSG_USERDATA); kit.Value(data, "action") != nil { kit.Fetch(kit.Value(data, "action.value"), func(key string, value string) { m.Option(key, value) }) @@ -338,7 +423,7 @@ var Index = &ice.Context{Name: "lark", Help: "机器人", if m.Hand = true; msg.Result() == "" { msg.Table() } - m.Cmd(SEND, "chat_id", m.Option(OPEN_CHAT_ID), msg.Result()) + m.Cmd(SEND, CHAT_ID, m.Option(OPEN_CHAT_ID), msg.Result()) return } @@ -368,112 +453,9 @@ var Index = &ice.Context{Name: "lark", Help: "机器人", } } } - case "event_click": - // 消息卡片 - m.Echo(kit.Format(map[string]interface{}{ - "header": map[string]interface{}{ - "title": map[string]interface{}{ - "tag": "lark_md", "content": "haha", - }, - }, - "elements": []interface{}{ - map[string]interface{}{ - "tag": "action", - "actions": []interface{}{ - map[string]interface{}{ - "tag": "button", - "type": "default", - "text": map[string]interface{}{ - "tag": "plain_text", - "content": m.Time(), - }, - "value": map[string]interface{}{ - "hi": "hello", - }, - }, - }, - }, - }, - })) } }}, - - "home": {Name: "form chat_id|open_id|user_id|email user title [text [confirm|value|url arg...]]...", Help: "消息", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { - m.Cmd("form", "chat_id", m.Option(OPEN_CHAT_ID), "home", "list", "pwd", "cmd", "pwd") - }}, - FORM: {Name: "form chat_id|open_id|user_id|email user title [text [confirm|value|url arg...]]...", Help: "消息", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { - var form = map[string]interface{}{"content": map[string]interface{}{}} - switch arg[0] { - case "chat_id", "open_id", "user_id", "email": - form[arg[0]], arg = arg[1], arg[2:] - default: - form["chat_id"], arg = arg[0], arg[1:] - } - - elements := []interface{}{} - elements = append(elements, map[string]interface{}{ - "tag": "div", - "text": map[string]interface{}{ - "tag": "plain_text", - "content": arg[1], - }, - }) - - actions := []interface{}{} - for i := 2; i < len(arg); i++ { - button := map[string]interface{}{ - "tag": "button", "text": map[string]interface{}{ - "tag": "plain_text", "content": arg[i], - }, - "type": "default", - } - - m.Debug("fuck %v", arg[i:]) - switch arg[i+1] { - case "confirm": - button[arg[i+1]], i = map[string]interface{}{ - "title": map[string]interface{}{"tag": "lark_md", "content": arg[i+2]}, - "text": map[string]interface{}{"tag": "lark_md", "content": arg[i+3]}, - }, i+3 - case "value": - button[arg[i+1]], i = map[string]interface{}{ - arg[i+2]: arg[i+3], - }, i+3 - case "url": - button[arg[i+1]], i = arg[i+2], i+2 - default: - button["value"], i = map[string]interface{}{ - arg[i+1]: arg[i+2], - OPEN_CHAT_ID: m.Option(OPEN_CHAT_ID), - }, i+2 - } - - actions = append(actions, button) - } - elements = append(elements, map[string]interface{}{ - "tag": "action", "actions": actions, - }) - - kit.Value(form, "msg_type", "interactive") - kit.Value(form, "card", map[string]interface{}{ - "config": map[string]interface{}{ - "wide_screen_mode": true, - // "title": map[string]interface{}{ - // "tag": "lark_md", "content": arg[1], - // }, - }, - "header": map[string]interface{}{ - "title": map[string]interface{}{ - "tag": "lark_md", "content": arg[0], - }, - }, - "elements": elements, - }) - - post(m, "bot", "/open-apis/message/v4/send/", "data", kit.Formats(form)) - }}, - - "/sso": {Name: "/sso", Help: "消息", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { + "/sso": {Name: "/sso", Help: "网页", Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { if m.Options("code") { m.Richs(APP, nil, "bot", func(key string, value map[string]interface{}) { data := kit.UnMarshal(m.Cmdx(web.SPIDE, LARK, "raw", "/open-apis/authen/v1/access_token",