diff --git a/package-lock.json b/package-lock.json
index 0c0f67e..cf9e8e2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -234,9 +234,9 @@
       "dev": true
     },
     "node_modules/@types/node": {
-      "version": "20.12.8",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz",
-      "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==",
+      "version": "20.12.10",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz",
+      "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==",
       "dev": true,
       "dependencies": {
         "undici-types": "~5.26.4"
diff --git a/src/helpers/interfaces.ts b/src/helpers/interfaces.ts
new file mode 100644
index 0000000..340c40b
--- /dev/null
+++ b/src/helpers/interfaces.ts
@@ -0,0 +1,17 @@
+export interface IUser {
+    id?: number;
+    username: string;
+    password: string;
+}
+
+export interface IMap {
+    name: string;
+    tiles: any;
+    width: number;
+    height: number;
+    players: {
+        id: number;
+        x: number;
+        y: number;
+    }[];
+}
\ No newline at end of file
diff --git a/src/server.ts b/src/server.ts
index 3cda215..14310c4 100644
--- a/src/server.ts
+++ b/src/server.ts
@@ -1,12 +1,12 @@
 import express from 'express';
-import { Server } from 'socket.io';
+import {Server} from 'socket.io';
 import http from 'http';
 import cors from 'cors';
 import UserRepository from "./repositories/User";
 import UserService from "./services/User";
 import MapRepository from "./repositories/Map";
-import prisma from "./helpers/prisma";
-import { registerUser, loginUser } from './helpers/http';
+import {loginUser, registerUser} from './helpers/http';
+import {IUser, IMap} from "./helpers/interfaces";
 
 const app = express();
 const server = http.createServer(app);
@@ -18,48 +18,100 @@ app.use(express.json());
 app.post('/login', loginUser);
 app.post('/register', registerUser);
 
-async function handleSocketConnection(socket: any) {
-    const {username, password} = socket.handshake.query;
+let world_players: any = {};
 
-    if (!username || !password) {
+async function handleSocketConnection(socket: any) {
+    const { username, password } = socket.handshake.query;
+
+    try {
+        await authenticateUser(socket, username, password);
+        await initializeUser(socket, username);
+        await setupMap(socket);
+        await startTickEmitter(socket);
+        listenForMoveEvents(socket);
+        listenForDisconnect(socket, username);
+    } catch (error) {
+        console.error('Error handling socket connection:', error.message);
         socket.disconnect(true);
-        return;
+    }
+}
+
+async function authenticateUser(socket: any, username: string, password: string) {
+    if (!username || !password) {
+        throw new Error('Username or password missing.');
     }
 
-    const user = UserRepository.getByUsername(username);
-
-    if (!user || !await UserService.validateUserCredentials(username, password)) {
-        socket.disconnect(true);
-        return;
+    const user = await UserRepository.getByUsername(username);
+    if (!user || !(await UserService.validateUserCredentials(username, password))) {
+        throw new Error('Invalid username or password.');
     }
 
     console.log('User connected:', username);
 
     socket.user = user;
 
-    socket.emit('message', 'Welcome to the server!');
+    world_players[user.id] = {
+        username: user.username,
+        coords: {
+            x: 0,
+            y: 0
+        }
+    };
+}
 
+async function initializeUser(socket: any, username: string) {
+    socket.emit('message', 'Welcome to the server!');
+}
+
+async function setupMap(socket: any) {
     const map = await MapRepository.getFirst();
     socket.join(map.name);
+    socket.emit('map', {
+        name: map.name,
+        tiles: map.tiles,
+        width: map.width,
+        height: map.height,
+        players: world_players
+    });
     socket.emit('message', 'You have joined the room: ' + map.name);
 
-    socket.on('get_map', () => {
-        console.log('Sending map to user:', username);
-        socket.emit('map', map);
-    });
+    // let the room know a new player has joined
+    io.to(map.name).emit('player_join', world_players[socket.user.id]);
+    return map;
+}
 
+async function startTickEmitter(socket: any) {
+    setInterval(async () => {
+        const users = await listConnectedUsers();
+        socket.emit('ping', users);
+    }, 3000);
+}
+
+function listenForMoveEvents(socket: any) {
     socket.on('move', (coords: any) => {
-        // const player = map.players.find((p: any) => p.username === socket.user.username);
-        // if (!player) return;
-        // player.coords = coords;
-        // io.to(map.name).emit('player_moved', map);
+        const user = socket.user as IUser;
+        world_players[user.id].coords = coords;
+        io.in('Test Map').emit('player_move', {
+            id: user.id,
+            coords
+        });
     });
+}
 
+function listenForDisconnect(socket: any, username: string) {
     socket.on('disconnect', () => {
         console.log('User disconnected:', username);
     });
 }
 
+// function list all connected users
+// function list all connected users
+async function listConnectedUsers() {
+    const sockets = await io.in('Test Map').fetchSockets();
+    // @ts-ignore
+    return sockets.map(socket => socket.user);
+}
+
 io.on('connection', handleSocketConnection);
 
 const PORT = process.env.PORT || 3000;