diff --git a/commands.go b/commands.go index 184af70..8c9689d 100644 --- a/commands.go +++ b/commands.go @@ -135,7 +135,7 @@ func (handler *CommandHandler) CommandMux(ce *CommandEvent) { handler.CommandLogout(ce) case "toggle": handler.CommandToggle(ce) - case "set-relay", "unset-relay", "login-matrix", "sync", "list", "open", "pm", "invite-link", "check-invite", "join", "create", "accept": + case "set-relay", "unset-relay", "login-matrix", "sync", "list", "search", "open", "pm", "invite-link", "check-invite", "join", "create", "accept": if !ce.User.HasSession() { ce.Reply("You are not logged in. Use the `login` command to log into WhatsApp.") return @@ -155,6 +155,8 @@ func (handler *CommandHandler) CommandMux(ce *CommandEvent) { handler.CommandSync(ce) case "list": handler.CommandList(ce) + case "search": + handler.CommandSearch(ce) case "open": handler.CommandOpen(ce) case "pm": @@ -708,6 +710,7 @@ func (handler *CommandHandler) CommandHelp(ce *CommandEvent) { cmdPrefix + cmdLogoutMatrixHelp, cmdPrefix + cmdToggleHelp, cmdPrefix + cmdListHelp, + cmdPrefix + cmdSearchHelp, cmdPrefix + cmdSyncHelp, cmdPrefix + cmdOpenHelp, cmdPrefix + cmdPMHelp, @@ -810,7 +813,15 @@ func (handler *CommandHandler) CommandDeleteAllPortals(ce *CommandEvent) { const cmdListHelp = `list [page] [items per page] - Get a list of all contacts and groups.` -func formatContacts(bridge *Bridge, input map[types.JID]types.ContactInfo) (result []string) { +func matchesQuery(str string, query string) bool { + if query == "" { + return true + } + return strings.Contains(strings.ToLower(str), query) +} + +func formatContacts(bridge *Bridge, input map[types.JID]types.ContactInfo, query string) (result []string) { + hasQuery := len(query) > 0 for jid, contact := range input { if len(contact.FullName) == 0 { continue @@ -820,15 +831,21 @@ func formatContacts(bridge *Bridge, input map[types.JID]types.ContactInfo) (resu if len(pushName) == 0 { pushName = contact.FullName } - result = append(result, fmt.Sprintf("* %s / [%s](https://matrix.to/#/%s) - `+%s`", contact.FullName, pushName, puppet.MXID, jid.User)) + + if !hasQuery || matchesQuery(pushName, query) || matchesQuery(contact.FullName, query) || matchesQuery(jid.User, query) { + result = append(result, fmt.Sprintf("* %s / [%s](https://matrix.to/#/%s) - `+%s`", contact.FullName, pushName, puppet.MXID, jid.User)) + } } sort.Sort(sort.StringSlice(result)) return } -func formatGroups(input []*types.GroupInfo) (result []string) { +func formatGroups(input []*types.GroupInfo, query string) (result []string) { + hasQuery := len(query) > 0 for _, group := range input { - result = append(result, fmt.Sprintf("* %s - `%s`", group.GroupName.Name, group.JID.User)) + if !hasQuery || matchesQuery(group.GroupName.Name, query) || matchesQuery(group.JID.User, query) { + result = append(result, fmt.Sprintf("* %s - `%s`", group.GroupName.Name, group.JID.User)) + } } sort.Sort(sort.StringSlice(result)) return @@ -874,14 +891,14 @@ func (handler *CommandHandler) CommandList(ce *CommandEvent) { ce.Reply("Failed to get contacts: %s", err) return } - result = formatContacts(ce.User.bridge, contactList) + result = formatContacts(ce.User.bridge, contactList, "") } else { groupList, err := ce.User.Client.GetJoinedGroups() if err != nil { ce.Reply("Failed to get groups: %s", err) return } - result = formatGroups(groupList) + result = formatGroups(groupList, "") } if len(result) == 0 { @@ -905,6 +922,47 @@ func (handler *CommandHandler) CommandList(ce *CommandEvent) { ce.Reply("### %s (page %d of %d)\n\n%s", typeName, page, pages, strings.Join(result, "\n")) } +const cmdSearchHelp = `search - Search for a contact or group using a query.` + +func (handler *CommandHandler) CommandSearch(ce *CommandEvent) { + if len(ce.Args) == 0 { + ce.Reply("**Usage:** `search `") + return + } + query := strings.ToLower(strings.TrimSpace(strings.Join(ce.Args, " "))) + + var err error + + contactList, err := ce.User.Client.Store.Contacts.GetAllContacts() + if err != nil { + ce.Reply("Failed to get contacts: %s", err) + return + } + formatedContacts := formatContacts(ce.User.bridge, contactList, query) + + groupList, err := ce.User.Client.GetJoinedGroups() + if err != nil { + ce.Reply("Failed to get groups: %s", err) + return + } + formatedGroups := formatGroups(groupList, query) + + var result string + if len(formatedContacts) > 0 { + result = "\n\n#### Contacts: \n\n" + strings.Join(formatedContacts, "\n") + } + if len(formatedGroups) > 0 { + result += "\n\n#### Groups: \n\n" + strings.Join(formatedGroups, "\n") + } + + if len(result) == 0 { + ce.Reply("No contacts or groups found") + return + } + + ce.Reply("### Search results:%s", result) +} + const cmdOpenHelp = `open <_group JID_> - Open a group chat portal.` func (handler *CommandHandler) CommandOpen(ce *CommandEvent) {