Implement search command

This commit is contained in:
abmantis 2021-11-05 00:27:08 +00:00
parent 5c1b57d7b8
commit dc9a075bc9

View file

@ -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 <contacts|groups> [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 query> - Search for a contact or group using a query.`
func (handler *CommandHandler) CommandSearch(ce *CommandEvent) {
if len(ce.Args) == 0 {
ce.Reply("**Usage:** `search <name query>`")
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) {