(irc) Don't connect until status set to 'online'

This commit is contained in:
Jaidyn Ann 2021-08-13 14:32:46 -05:00
parent 6258b2f2f3
commit a712d89c76
2 changed files with 63 additions and 27 deletions

View File

@ -30,6 +30,7 @@ status_t
connect_thread(void* data) connect_thread(void* data)
{ {
IrcProtocol* protocol = (IrcProtocol*)data; IrcProtocol* protocol = (IrcProtocol*)data;
protocol->Connect();
status_t status = protocol->Loop(); status_t status = protocol->Loop();
exit(status); exit(status);
} }
@ -78,38 +79,17 @@ IrcProtocol::UpdateSettings(BMessage* settings)
fNick = settings->FindString("nick"); fNick = settings->FindString("nick");
fPartText = settings->GetString("part", "Cardie[0.1]: i've been liquified!"); fPartText = settings->GetString("part", "Cardie[0.1]: i've been liquified!");
fUser = settings->FindString("ident"); fUser = settings->FindString("ident");
const char* real_name = settings->FindString("real_name"); fRealName = settings->FindString("real_name");
const char* server = settings->FindString("server"); fServer = settings->FindString("server");
const char* password = settings->FindString("password"); fPassword = settings->FindString("password");
int32 port = settings->FindInt32("port"); fPort = settings->FindInt32("port");
bool ssl = settings->GetBool("ssl", false); fSsl = settings->GetBool("ssl", false);
fSocket = ssl ? new BSecureSocket : new BSocket;
if (fSocket->Connect(BNetworkAddress(server, port)) != B_OK)
return B_ERROR;
if (password != NULL) {
BString passMsg = "PASS ";
passMsg << password;
_SendIrc(passMsg);
}
BString userMsg = "USER ";
userMsg << fUser << " * 0 :" << real_name;
_SendIrc(userMsg);
BString nickMsg = "NICK ";
nickMsg << fNick;
_SendIrc(nickMsg);
fRecvThread = spawn_thread(connect_thread, "what_a_tangled_web_we_weave", fRecvThread = spawn_thread(connect_thread, "what_a_tangled_web_we_weave",
B_NORMAL_PRIORITY, (void*)this); B_NORMAL_PRIORITY, (void*)this);
if (fRecvThread < B_OK) if (fRecvThread < B_OK)
return B_ERROR; return B_ERROR;
resume_thread(fRecvThread);
return B_OK; return B_OK;
} }
@ -119,6 +99,30 @@ IrcProtocol::Process(BMessage* msg)
{ {
int32 im_what = msg->FindInt32("im_what"); int32 im_what = msg->FindInt32("im_what");
switch (im_what) { switch (im_what) {
case IM_SET_OWN_STATUS:
{
int32 status = msg->FindInt32("status");
BString status_msg = msg->FindString("message");
BMessage statusSet(IM_MESSAGE);
statusSet.AddInt32("im_what", IM_OWN_STATUS_SET);
switch (status) {
case STATUS_ONLINE:
statusSet.AddInt32("status", STATUS_ONLINE);
resume_thread(fRecvThread);
break;
case STATUS_OFFLINE:
statusSet.AddInt32("status", STATUS_OFFLINE);
Shutdown();
break;
default:
break;
}
if (status == STATUS_ONLINE || status == STATUS_OFFLINE)
_SendMsg(&statusSet);
break;
}
case IM_SEND_MESSAGE: case IM_SEND_MESSAGE:
{ {
BString chat_id = msg->FindString("chat_id"); BString chat_id = msg->FindString("chat_id");
@ -233,6 +237,31 @@ IrcProtocol::Icon() const
} }
status_t
IrcProtocol::Connect()
{
fSocket = fSsl ? new BSecureSocket : new BSocket;
if (fSocket->Connect(BNetworkAddress(fServer, fPort)) != B_OK)
return B_ERROR;
if (fPassword.IsEmpty() == false) {
BString passMsg = "PASS ";
passMsg << fPassword;
_SendIrc(passMsg);
}
BString userMsg = "USER ";
userMsg << fUser << " * 0 :" << fRealName;
_SendIrc(userMsg);
BString nickMsg = "NICK ";
nickMsg << fNick;
_SendIrc(nickMsg);
return B_OK;
}
status_t status_t
IrcProtocol::Loop() IrcProtocol::Loop()
{ {

View File

@ -50,6 +50,7 @@ public:
MessengerInterface() const { return fMessenger; } MessengerInterface() const { return fMessenger; }
// IRC // IRC
status_t Connect();
status_t Loop(); status_t Loop();
BMessage* fSettings; BMessage* fSettings;
@ -99,10 +100,16 @@ private:
BString fRemainingBuf; BString fRemainingBuf;
thread_id fRecvThread; thread_id fRecvThread;
// Settings
BString fNick; BString fNick;
const char* fUser; BString fUser;
BString fIdent; BString fIdent;
BString fPartText; BString fPartText;
BString fRealName;
BString fPassword;
BString fServer;
int32 fPort;
bool fSsl;
// WHOREPLY is requested by the add-on to populate the user-list, but the // WHOREPLY is requested by the add-on to populate the user-list, but the
// user might also use the /who command― if the user does, this is true // user might also use the /who command― if the user does, this is true