Skip to content
This repository has been archived by the owner on Jan 29, 2024. It is now read-only.

Commit

Permalink
MUC presence error handling.
Browse files Browse the repository at this point in the history
Closes #15
  • Loading branch information
COM8 committed Sep 3, 2021
1 parent 8fd2584 commit 95b19c5
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 8 deletions.
27 changes: 21 additions & 6 deletions Manager/Classes/MucJoinHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,12 @@ public async Task EnterRoomAsync()
// Subscribe to events for receiving answers:
CLIENT.NewMUCMemberPresenceMessage -= OnMucMemberPresenceMessage;
CLIENT.NewMUCMemberPresenceMessage += OnMucMemberPresenceMessage;
CLIENT.NewMUCPresenceErrorMessage -= OnMucPresenceErrorMessage;
CLIENT.NewMUCPresenceErrorMessage += OnMucPresenceErrorMessage;

// Send message:
await CLIENT.SendAsync(msg);
Logger.Info("Entering MUC room '" + INFO.chat.bareJid + "' as '" + INFO.nickname + '\'');
Logger.Info($"Entering MUC room '{INFO.chat.bareJid}' as '{INFO.nickname }'...");
}

public bool CanGetRemoved()
Expand Down Expand Up @@ -111,19 +113,17 @@ private void OnMucMemberPresenceMessage(XMPPClient client, NewMUCMemberPresenceM
case MUCPresenceStatusCode.PRESENCE_SELFE_REFERENCE:
// Remove event subscription:
CLIENT.NewMUCMemberPresenceMessage -= OnMucMemberPresenceMessage;
CLIENT.NewMUCPresenceErrorMessage -= OnMucPresenceErrorMessage;

using (SemaLock semaLock = INFO.NewSemaLock())
{
// Update MUC info:
INFO.state = MucState.ENTERD;
INFO.affiliation = args.mucMemberPresenceMessage.AFFILIATION;
INFO.role = args.mucMemberPresenceMessage.ROLE;
using (MainDbContext ctx = new MainDbContext())
{
ctx.Update(INFO);
}
INFO.Update();
}
Logger.Info("Entered MUC room '" + roomJId + "' as '" + INFO.nickname + "' with role '" + INFO.role + "' and affiliation '" + INFO.affiliation + '\'');
Logger.Info($"Entered MUC room '{roomJId}' as '{INFO.nickname}' with role '{INFO.role}' and affiliation '{INFO.affiliation}'");
break;

default:
Expand All @@ -137,6 +137,21 @@ private void OnMucMemberPresenceMessage(XMPPClient client, NewMUCMemberPresenceM
}
}

private void OnMucPresenceErrorMessage(XMPPClient client, NewMUCPresenceErrorMessageEventArgs args)
{
// Remove event subscription:
CLIENT.NewMUCMemberPresenceMessage -= OnMucMemberPresenceMessage;
CLIENT.NewMUCPresenceErrorMessage -= OnMucPresenceErrorMessage;

using (SemaLock semaLock = INFO.NewSemaLock())
{
// Update MUC info:
INFO.state = MucState.ERROR;
INFO.Update();
}
Logger.Error($"Failed to join '{INFO.chat.bareJid}' with: {args.mucPresenceErrorMessage.ERROR}");
}

#endregion
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
using XMPP_API.Classes.Network.XML.Messages.XEP_0045;

namespace XMPP_API.Classes.Network.Events
{
public class NewMUCPresenceErrorMessageEventArgs
{
//--------------------------------------------------------Attributes:-----------------------------------------------------------------\\
#region --Attributes--
public readonly MUCPresenceErrorMessage mucPresenceErrorMessage;

#endregion
//--------------------------------------------------------Constructor:----------------------------------------------------------------\\
#region --Constructors--
public NewMUCPresenceErrorMessageEventArgs(MUCPresenceErrorMessage mucPresenceErrorMessage)
{
this.mucPresenceErrorMessage = mucPresenceErrorMessage;
}

#endregion
//--------------------------------------------------------Set-, Get- Methods:---------------------------------------------------------\\
#region --Set-, Get- Methods--


#endregion
//--------------------------------------------------------Misc Methods:---------------------------------------------------------------\\
#region --Misc Methods (Public)--


#endregion

#region --Misc Methods (Private)--


#endregion

#region --Misc Methods (Protected)--


#endregion
//--------------------------------------------------------Events:---------------------------------------------------------------------\\
#region --Events--


#endregion
}
}
10 changes: 8 additions & 2 deletions XMPP_API/Classes/XMPPClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public XmppConnection connection
public delegate void MessageSendEventHandler(XMPPClient client, MessageSendEventArgs args);
public delegate void NewBookmarksResultMessageEventHandler(XMPPClient client, NewBookmarksResultMessageEventArgs args);
public delegate void NewMUCMemberPresenceMessageEventHandler(XMPPClient client, NewMUCMemberPresenceMessageEventArgs args);
public delegate void NewMUCPresenceErrorMessageEventHandler(XMPPClient client, NewMUCPresenceErrorMessageEventArgs args);
public delegate void NewDeliveryReceiptHandler(XMPPClient client, NewDeliveryReceiptEventArgs args);
public delegate void NewPubSubEventHandler(XMPPClient client, NewPubSubEventEventArgs args);
public delegate void OmemoSessionBuildErrorEventHandler(XMPPClient client, OmemoSessionBuildErrorEventArgs args);
Expand All @@ -49,6 +50,7 @@ public XmppConnection connection
public event NewChatStateEventHandler NewChatState;
public event MessageSendEventHandler MessageSend;
public event NewMUCMemberPresenceMessageEventHandler NewMUCMemberPresenceMessage;
public event NewMUCPresenceErrorMessageEventHandler NewMUCPresenceErrorMessage;
public event NewValidMessageEventHandler NewValidMessage;
public event NewBookmarksResultMessageEventHandler NewBookmarksResultMessage;
public event NewDeliveryReceiptHandler NewDeliveryReceipt;
Expand Down Expand Up @@ -307,9 +309,13 @@ private void Connection_ConnectionNewValidMessage(IMessageSender sender, NewVali
private void Connection_ConnectionNewPresenceMessage(IMessageSender connection, NewValidMessageEventArgs args)
{
// XEP-0045 (MUC member presence):
if (args.MESSAGE is MUCMemberPresenceMessage)
if (args.MESSAGE is MUCMemberPresenceMessage mucPresence)
{
NewMUCMemberPresenceMessage?.Invoke(this, new NewMUCMemberPresenceMessageEventArgs(args.MESSAGE as MUCMemberPresenceMessage));
NewMUCMemberPresenceMessage?.Invoke(this, new NewMUCMemberPresenceMessageEventArgs(mucPresence));
}
else if (args.MESSAGE is MUCPresenceErrorMessage mucPresenceError)
{
NewMUCPresenceErrorMessage?.Invoke(this, new NewMUCPresenceErrorMessageEventArgs(mucPresenceError));
}
else
{
Expand Down
1 change: 1 addition & 0 deletions XMPP_API/XMPP_API.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@
<Compile Include="Classes\Network\Events\NewChatMessageEventArgs.cs" />
<Compile Include="Classes\Network\Events\NewChatStateEventArgs.cs" />
<Compile Include="Classes\Network\Events\NewDataReceivedEventArgs.cs" />
<Compile Include="Classes\Network\Events\NewMUCPresenceErrorMessageEventArgs.cs" />
<Compile Include="Classes\Network\Events\NewPubSubEventEventArgs.cs" />
<Compile Include="Classes\Network\Events\NewDeliveryReceiptEventArgs.cs" />
<Compile Include="Classes\Network\Events\NewDiscoResponseMessageEventArgs.cs" />
Expand Down

0 comments on commit 95b19c5

Please sign in to comment.