|
@@ -136,7 +136,7 @@ func (handler *CommandHandler) CommandMux(ce *CommandEvent) {
|
|
handler.CommandLogout(ce)
|
|
handler.CommandLogout(ce)
|
|
case "toggle":
|
|
case "toggle":
|
|
handler.CommandToggle(ce)
|
|
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() {
|
|
if !ce.User.HasSession() {
|
|
ce.Reply("You are not logged in. Use the `login` command to log into WhatsApp.")
|
|
ce.Reply("You are not logged in. Use the `login` command to log into WhatsApp.")
|
|
return
|
|
return
|
|
@@ -156,6 +156,8 @@ func (handler *CommandHandler) CommandMux(ce *CommandEvent) {
|
|
handler.CommandSync(ce)
|
|
handler.CommandSync(ce)
|
|
case "list":
|
|
case "list":
|
|
handler.CommandList(ce)
|
|
handler.CommandList(ce)
|
|
|
|
+ case "search":
|
|
|
|
+ handler.CommandSearch(ce)
|
|
case "open":
|
|
case "open":
|
|
handler.CommandOpen(ce)
|
|
handler.CommandOpen(ce)
|
|
case "pm":
|
|
case "pm":
|
|
@@ -709,6 +711,7 @@ func (handler *CommandHandler) CommandHelp(ce *CommandEvent) {
|
|
cmdPrefix + cmdLogoutMatrixHelp,
|
|
cmdPrefix + cmdLogoutMatrixHelp,
|
|
cmdPrefix + cmdToggleHelp,
|
|
cmdPrefix + cmdToggleHelp,
|
|
cmdPrefix + cmdListHelp,
|
|
cmdPrefix + cmdListHelp,
|
|
|
|
+ cmdPrefix + cmdSearchHelp,
|
|
cmdPrefix + cmdSyncHelp,
|
|
cmdPrefix + cmdSyncHelp,
|
|
cmdPrefix + cmdOpenHelp,
|
|
cmdPrefix + cmdOpenHelp,
|
|
cmdPrefix + cmdPMHelp,
|
|
cmdPrefix + cmdPMHelp,
|
|
@@ -811,7 +814,15 @@ func (handler *CommandHandler) CommandDeleteAllPortals(ce *CommandEvent) {
|
|
|
|
|
|
const cmdListHelp = `list <contacts|groups> [page] [items per page] - Get a list of all contacts and groups.`
|
|
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 {
|
|
for jid, contact := range input {
|
|
if len(contact.FullName) == 0 {
|
|
if len(contact.FullName) == 0 {
|
|
continue
|
|
continue
|
|
@@ -821,15 +832,21 @@ func formatContacts(bridge *Bridge, input map[types.JID]types.ContactInfo) (resu
|
|
if len(pushName) == 0 {
|
|
if len(pushName) == 0 {
|
|
pushName = contact.FullName
|
|
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))
|
|
sort.Sort(sort.StringSlice(result))
|
|
return
|
|
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 {
|
|
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))
|
|
sort.Sort(sort.StringSlice(result))
|
|
return
|
|
return
|
|
@@ -875,14 +892,14 @@ func (handler *CommandHandler) CommandList(ce *CommandEvent) {
|
|
ce.Reply("Failed to get contacts: %s", err)
|
|
ce.Reply("Failed to get contacts: %s", err)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- result = formatContacts(ce.User.bridge, contactList)
|
|
|
|
|
|
+ result = formatContacts(ce.User.bridge, contactList, "")
|
|
} else {
|
|
} else {
|
|
groupList, err := ce.User.Client.GetJoinedGroups()
|
|
groupList, err := ce.User.Client.GetJoinedGroups()
|
|
if err != nil {
|
|
if err != nil {
|
|
ce.Reply("Failed to get groups: %s", err)
|
|
ce.Reply("Failed to get groups: %s", err)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- result = formatGroups(groupList)
|
|
|
|
|
|
+ result = formatGroups(groupList, "")
|
|
}
|
|
}
|
|
|
|
|
|
if len(result) == 0 {
|
|
if len(result) == 0 {
|
|
@@ -906,6 +923,47 @@ func (handler *CommandHandler) CommandList(ce *CommandEvent) {
|
|
ce.Reply("### %s (page %d of %d)\n\n%s", typeName, page, pages, strings.Join(result, "\n"))
|
|
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.`
|
|
const cmdOpenHelp = `open <_group JID_> - Open a group chat portal.`
|
|
|
|
|
|
func (handler *CommandHandler) CommandOpen(ce *CommandEvent) {
|
|
func (handler *CommandHandler) CommandOpen(ce *CommandEvent) {
|