Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module packethandler;
- public import std.socket;
- import std.conv, std.stdio, util;
- /**
- Receives a specific type.
- */
- T read(T)(Socket socket) if(!is(T : string)) {
- T[1] arr;
- socket.receive(arr);
- return arr[0];
- }
- /**
- Receives a null-terminated string.
- */
- string read(T)(Socket socket) if(is(T : string)) {
- char[] arr;
- while(true) {
- char c = socket.read!char;
- if(c != 0)
- arr ~= c;
- else
- break;
- }
- return arr.idup;
- }
- /**
- Writes data.
- */
- void write(T)(Socket socket, T data) if(!is(T : string)) {
- auto arr = [data];
- socket.send(arr);
- }
- /**
- Writes null-terminated string.
- */
- void write(Socket socket, string data) {
- socket.send(data);
- socket.send(['\0']);
- }
- /**
- Class which handles incoming packets.
- */
- final class PacketHandler {
- __gshared private static:
- void delegate(Socket socket)[short] delegates;
- __gshared public static:
- void RegisterHandler(short id, void delegate(Socket socket) dg) {
- delegates[id] = dg;
- }
- // TODO:
- void HandlePacket(short id, Socket socket) {
- if(auto ptr = id in delegates)
- (*ptr)(socket);
- else
- DebugPrint("No handler for packet id ", id);
- }
- }
- mixin template RegisterHandler(short id, void function(Socket socket) dg) {
- static this() {
- PacketHandler.RegisterHandler(id, (socket) => dg(socket));
- }
- }
- mixin template RegisterHandler(short id, void delegate(Socket socket) dg) {
- static this() {
- PacketHandler.RegisterHandler(id, dg);
- }
- }
Add Comment
Please, Sign In to add comment