1 module voxelman.chat.plugin;
2 
3 import std.experimental.logger;
4 import pluginlib;
5 import voxelman.utils.messagewindow : MessageWindow;
6 
7 import voxelman.core.events;
8 import voxelman.net.packets;
9 
10 import voxelman.command.plugin;
11 import voxelman.eventdispatcher.plugin;
12 import voxelman.net.plugin;
13 import voxelman.login.plugin;
14 
15 shared static this()
16 {
17 	pluginRegistry.regClientPlugin(new ChatPluginClient);
18 	pluginRegistry.regServerPlugin(new ChatPluginServer);
19 }
20 
21 final class ChatPluginClient : IPlugin
22 {
23 	// IPlugin stuff
24 	mixin IdAndSemverFrom!(voxelman.chat.plugininfo);
25 
26 	private ClientDbClient clientDb;
27 	private NetClientPlugin connection;
28 	private EventDispatcherPlugin evDispatcher;
29 	MessageWindow messageWindow;
30 	float alpha;
31 
32 	override void preInit()
33 	{
34 		messageWindow.init();
35 		messageWindow.messageHandler =
36 			(string msg) => connection.send(MessagePacket(0, msg), 1);
37 	}
38 
39 	override void init(IPluginManager pluginman)
40 	{
41 		clientDb = pluginman.getPlugin!ClientDbClient;
42 		evDispatcher = pluginman.getPlugin!EventDispatcherPlugin;
43 		evDispatcher.subscribeToEvent(&onUpdateEvent);
44 
45 		connection = pluginman.getPlugin!NetClientPlugin;
46 		connection.registerPacketHandler!MessagePacket(&handleMessagePacket);
47 	}
48 
49 	void handleMessagePacket(ubyte[] packetData, ClientId clientId)
50 	{
51 		import std.format : formattedWrite;
52 		auto packet = unpackPacket!MessagePacket(packetData);
53 
54 		if (packet.clientId == 0)
55 			messageWindow.putln(packet.msg);
56 		else {
57 			messageWindow.putf("%s> %s\n", clientDb.clientName(packet.clientId), packet.msg);
58 		}
59 	}
60 
61 	void onUpdateEvent(ref UpdateEvent event)
62 	{
63 		import derelict.imgui.imgui;
64 
65 		float h = 200;
66 		igSetNextWindowPos(ImVec2(0, igGetIO().DisplaySize.y-h), ImGuiSetCond_Always);
67 		igSetNextWindowSize(ImVec2(400, h), ImGuiSetCond_Always);
68 		if (!igBegin2("Chat", null, ImVec2(0,0), 0.0f,
69 			ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize|
70 			ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoSavedSettings))
71 		{
72 			igEnd();
73 			return;
74 		}
75 		//if (!igBegin("Chat")) return;
76 		messageWindow.draw();
77 		igEnd();
78 	}
79 }
80 
81 final class ChatPluginServer : IPlugin
82 {
83 	// IPlugin stuff
84 	mixin IdAndSemverFrom!(voxelman.chat.plugininfo);
85 
86 	private NetServerPlugin connection;
87 	private ClientDbServer clientDb;
88 	CommandPluginServer commandPlugin;
89 
90 	override void init(IPluginManager pluginman)
91 	{
92 		connection = pluginman.getPlugin!NetServerPlugin;
93 		connection.registerPacketHandler!MessagePacket(&handleMessagePacket);
94 		clientDb = pluginman.getPlugin!ClientDbServer;
95 		commandPlugin = pluginman.getPlugin!CommandPluginServer;
96 		commandPlugin.registerCommand("msg", &messageCommand);
97 	}
98 
99 	void handleMessagePacket(ubyte[] packetData, ClientId clientId)
100 	{
101 		auto packet = unpackPacket!MessagePacket(packetData);
102 		packet.clientId = clientId;
103 		connection.sendToAll(packet);
104 		infof("%s> %s", clientDb.clientName(clientId), packet.msg);
105 	}
106 
107 	void messageCommand(CommandParams params)
108 	{
109 		auto stripped = params.rawStrippedArgs;
110 		connection.sendToAll(MessagePacket(0, stripped));
111 		infof("> %s", stripped);
112 	}
113 }