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