public class CallEvents
{
private XmppClientConnection _xmpp;
private readonly IDictionary
<string, Call
> _calls
= new Dictionary
<string, Call
>();
private IPersonRepository _personRepository;
private int _reconnectRetryCount;
private readonly int[] _reconnectRetryIntervals = { 30000, 60000, 300000, 600000 };
private Jid _userJid;
private string _logPath;
private int _organisationID;
public void Init(IKernel kernel, RealtimeUserEventWebhookSetting settings)
{
ConsoleUtils.DebugMessage("CallEvents.Init");
_userJid
= new Jid
(settings
.UserJid);
var resourceID = Guid.NewGuid().ToString("N").Substring(0, 8);
_personRepository = kernel.Get<IPersonRepository>();
_organisationID = _personRepository.All().First(x => x.CompassUsername == _userJid.User).OrganisationID;
_xmpp
= new XmppClientConnection
{
Server = _userJid.Server,
Username = _userJid.User,
Password = settings.Password,
AutoResolveConnectServer = true,
Resource = resourceID
};
_xmpp.OnLogin += delegate
{
AddXmppLog("OnLogin", null);
// update user with resource ID
_userJid.Resource = resourceID;
var iq
= new IQ
(IqType
.get, _userJid,
new Jid
("phone." + _userJid
.Server))
{
Id = Guid.NewGuid().ToString("N").Substring(0, 8),
InnerXml = "<request type=\"GET_COMPANY\" xmlns=\"http://demo.com/compass\"/>"
};
_xmpp.IqGrabber.SendIq(iq, (sender, iqresult, data) =>
{
AddXmppLog("OnSubscribe", iqresult.ToString());
// current organisationID for user
var organisationID = iqresult.FirstChild.SelectSingleElement("id").Value;
// subscribe to notifications
var psm
= new PubSubManager
(_xmpp
);
psm
.Subscribe(new Jid
("pubsub." + _userJid
.Server), _userJid, organisationID
);
});
};
_xmpp.OnReadXml += (sender, xmlString) =>
{
// parse string
};
_xmpp.OnAuthError += (sender, element) =>
{
AddXmppLog("OnAuthError", element.ToString());
Reconnect();
};
_xmpp.OnError += (sender, exception) =>
{
AddXmppLog("OnError", exception.ParseException());
Reconnect();
};
_xmpp.OnStreamError += (sender, element) =>
{
AddXmppLog("OnStreamError", element.ToString());
Reconnect();
};
_xmpp.OnSocketError += (sender, element) =>
{
AddXmppLog("OnSocketError", element.ToString());
Reconnect();
};
_xmpp.OnClose += sender =>
{
AddXmppLog("OnClose", sender.ToString());
Reconnect();
};
}
public void Start()
{
AddXmppLog("Start");
_xmpp.Open();
}
public void Stop()
{
AddXmppLog("Close");
_xmpp.Close();
}
public void Reconnect()
{
AddXmppLog("Reconnect");
Stop();
var timer
= new Timer
{Interval
= _reconnectRetryIntervals
[_reconnectRetryCount
]};
timer.Elapsed += (sender, args) =>
{
timer.Stop();
timer = null;
if (_reconnectRetryCount < _reconnectRetryIntervals.Length)
{
_reconnectRetryCount++;
}
else
{
_reconnectRetryCount = 0;
}
Start();
};
timer.Start();
}
public void AddXmppLog(string type, string text = null)
{
// add to db
}
}