/// <summary> /// Sends a <seealso cref="QueryArchiveMessage"/> to the server and requests the MAM archive. /// </summary> /// <param name="filter">A filter for filtering the MAM results like filtering by JID.</param> /// <param name="rsm">Optional configuration for the result set.</param> /// <param name="to">The target of the request. null for request to your own server. Used for requesting MUC-MAMs.</param> /// <returns>The result of the request.</returns> public async Task<MessageResponseHelperResult<MamResult>> requestMamAsync(QueryFilter filter, Set rsm, string to) { QueryArchiveMessage msg = new QueryArchiveMessage(filter, rsm, CONNECTION.account.getFullJid(), to); List<QueryArchiveResultMessage> results = new List<QueryArchiveResultMessage>(); Predicate<AbstractAddressableMessage> predicate = (x) => { if (x is QueryArchiveResultMessage result && string.Equals(result.QUERY_ID, msg.QUERY_ID)) { results.Insert(0, result); return false; } return x is QueryArchiveFinishMessage fin && string.Equals(fin.ID, msg.ID) && string.Equals(fin.QUERY_ID, msg.QUERY_ID); }; AsyncMessageResponseHelper<AbstractAddressableMessage> helper = new AsyncMessageResponseHelper<AbstractAddressableMessage>(CONNECTION, predicate) { matchId = false }; MessageResponseHelperResult<AbstractAddressableMessage> finResult = await helper.startAsync(msg); MamResult mamResult = null; if (finResult.STATE == MessageResponseHelperResultState.SUCCESS) { mamResult = new MamResult(finResult.RESULT as QueryArchiveFinishMessage, results); } return new MessageResponseHelperResult<MamResult>(finResult.STATE, mamResult); }
/// <summary> /// Sends a <seealso cref="QueryArchiveMessage"/> to the server and requests the MAM archive. /// </summary> /// <param name="filter">A filter for filtering the MAM results like filtering by JID.</param> /// <param name="rsm">Optional configuration for the result set.</param> /// <param name="to">The target of the request. null for request to your own server. Used for requesting MUC-MAMs.</param> /// <returns>The result of the request.</returns> public async Task <MessageResponseHelperResult <MamResult> > requestMamAsync(QueryFilter filter, Set rsm, string to) { QueryArchiveMessage msg = new QueryArchiveMessage(filter, rsm, CONNECTION.account.getFullJid(), to); List <QueryArchiveResultMessage> results = new List <QueryArchiveResultMessage>(); Predicate <AbstractAddressableMessage> predicate = (x) => { if (x is QueryArchiveResultMessage result && string.Equals(result.QUERY_ID, msg.QUERY_ID)) { results.Insert(0, result); return(false); } if (x is IQErrorMessage && string.Equals(msg.ID, x.ID)) { return(true); } return(x is QueryArchiveFinishMessage fin && string.Equals(fin.ID, msg.ID)); }; AsyncMessageResponseHelper <AbstractAddressableMessage> helper = new AsyncMessageResponseHelper <AbstractAddressableMessage>(CONNECTION, predicate) { matchId = false }; MessageResponseHelperResult <AbstractAddressableMessage> finResult = await helper.startAsync(msg); MamResult mamResult = null; if (finResult.STATE == MessageResponseHelperResultState.SUCCESS) { if (finResult.RESULT is QueryArchiveFinishMessage archiveFinishMessage) { mamResult = new MamResult(finResult.RESULT as QueryArchiveFinishMessage, results); } else { if (finResult.RESULT is IQErrorMessage errorMessage) { Logger.Warn($"Failed to request MAM from {to} with: {errorMessage.ERROR_OBJ}"); } return(new MessageResponseHelperResult <MamResult>(MessageResponseHelperResultState.ERROR, null)); } } return(new MessageResponseHelperResult <MamResult>(finResult.STATE, mamResult)); }