瀏覽代碼

Merge remote-tracking branch 'abmantis/search_cmd'

Tulir Asokan 3 年之前
父節點
當前提交
678c01cf09
共有 1 個文件被更改,包括 65 次插入7 次删除
  1. 65 7
      commands.go

+ 65 - 7
commands.go

@@ -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) {