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 }