Skip to content

Instantly share code, notes, and snippets.

@onzag
Created February 25, 2016 13:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save onzag/0d0440e445b646a4a5de to your computer and use it in GitHub Desktop.
Save onzag/0d0440e445b646a4a5de to your computer and use it in GitHub Desktop.
-- Register the client event for an incoming message sent by another user
SELECT eventzServ.registerCli('incomingMessage',E'Provides a new message from another user\n'
'message: The message that the other user sent\n'
'origin: The ip of origin as a string');
-- Register the client event for an incoming message sent by the server
SELECT eventzServ.registerCli('incomingMessageServer',E'Provides a new message from the server\n'
'message: The message that the server sent\n');
-- A controller for when a new message is sent to be post
CREATE OR REPLACE FUNCTION controllers."postMessage"(sender BYTEA, data JSONB, handle TEXT) RETURNS VOID AS $$
DECLARE query JSONB;
BEGIN
SELECT eventzServ.getQuery(socket) INTO query;
-- send that message to all but the current ip
PERFORM eventzServ.sendAllBut((ARRAY[sender])::BYTEA[],'incomingMessage',
('{"origin":"' || query->>'nick' || '","message":' || (data -> 'message')::TEXT || '}')::JSONB,handle);
END;
$$ LANGUAGE plpgsql;
-- Register such event
SELECT eventzServ.register('postMessage',E'Sends a new message to the chat room\n'
'message: A string containing message body');
-- When an user connects
CREATE OR REPLACE FUNCTION controllers.__auth(ip INET,query JSONB) RETURNS BOOL AS $$
DECLARE isAllowed BOOL;
BEGIN
SELECT (query->'nick') IS NOT NULL INTO isAllowed;
RETURN isAllowed;
END;
$$ LANGUAGE plpgsql;
-- Register the pseudo-event
SELECT eventzServ.register('__connect',NULL);
-- When an user connects
CREATE OR REPLACE FUNCTION controllers.__connect(socket BYTEA) RETURNS VOID AS $$
DECLARE ip INET;
DECLARE query JSONB;
BEGIN
SELECT eventzServ.getIP(socket) INTO ip;
SELECT eventzServ.getQuery(socket) INTO query;
-- send a server message to all but the current ip that a new user connected
PERFORM eventzServ.sendAllBut((ARRAY[socket])::UUID[],'incomingMessageServer',
('{"message":"user ' || query->>'nick' || '@' || ip::TEXT || 'connected"}')::JSONB,NULL);
PERFORM eventzServ.send(socket,'incomingMessageServer',
('{"message":"Welcome to our little chat room"}')::JSONB,NULL);
END;
$$ LANGUAGE plpgsql;
-- Register the pseudo-event
SELECT eventzServ.register('__connect',NULL);
-- When an user disconnects
CREATE OR REPLACE FUNCTION controllers.__disconnect(socket BYTEA) RETURNS VOID AS $$
DECLARE ip INET;
DECLARE query JSONB;
BEGIN
SELECT eventzServ.getIP(socket) INTO ip;
SELECT eventzServ.getQuery(socket) INTO query;
-- send a server message to all but the current ip that a new user disconnected
PERFORM eventzServ.sendAllBut((ARRAY[socket])::UUID[],'incomingMessageServer',
('{"message":"user ' || query->>'nick' || '@' || ip::TEXT || 'disconnected"}')::JSONB,NULL);
END;
$$ LANGUAGE plpgsql;
-- Register the pseudo-event
SELECT eventzServ.register('__disconnect',NULL);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment