skippy/source/notifications.d

93 lines
2.0 KiB
D
Raw Normal View History

import core.thread : Thread;
import tristanable.manager;
import tristanable.notifications;
import std.stdio;
import core.time : dur;
import tristanable.encoding;
2020-09-25 17:51:24 +00:00
public class NotificationWatcher : Thread
{
private DClient client;
2020-09-25 17:51:24 +00:00
2020-12-04 16:00:43 +00:00
this(DClient client)
{
super(&worker);
2020-12-04 16:00:43 +00:00
this.client = client;
2020-09-25 17:51:24 +00:00
2020-12-04 16:00:43 +00:00
/* Start the notification watcher */
start();
}
2020-09-25 17:51:24 +00:00
private void worker()
{
while(true)
{
/* Check for notifications every 2 seconds */
NotificationReply[] notifications =manager.popNotifications();
2020-09-25 17:51:24 +00:00
if(notifications.length)
{
//writeln(notifications);
foreach(NotificationReply notificationReply; notifications)
{
//writeln(notificationReply.getData());
2020-09-25 17:51:24 +00:00
/* Await a notification */
manager.awaitNotification();
string msg = cast(string)notificationReply.getData();
writeln("!> "~msg);
process(notificationReply.getData());
}
}
2020-09-25 20:16:23 +00:00
Thread.getThis().sleep(dur!("seconds")(2));
}
}
2020-09-25 20:16:23 +00:00
/**
* Processes an incoming notification
* accordingly
*/
private void process(byte[] data)
{
/* TODO: Implement me */
/* TODO: Check notification type */
byte notificationType = data[0];
/* For normal message (to channel or user) */
if(notificationType == cast(byte)0)
{
/* TODO: Decode using tristanable */
writeln("new message");
}
/* Channel notification (ntype=1) */
else if(notificationType == cast(byte)1)
{
/* TODO: Decode using tristanable */
/* TODO: Get the username of the user that left */
//writeln("user left/join message");
/* Get the sub-type */
byte subType = data[1];
/* If the notification was leave (stype=0) */
if(subType == cast(byte)0)
{
string username = cast(string)data[2..data.length];
writeln("<-- "~username~" left the channel");
}
/* If the notification was join (stype=1) */
else if(subType == cast(byte)1)
{
string username = cast(string)data[2..data.length];
writeln("--> "~username~" joined the channel");
}
/* TODO: Unknown */
else
{
}
}
}
}