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 }