% coding: utf-8 % Copyright 2008 Grégory Burri % % This file is part of Euphorik. % % Euphorik is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % Euphorik is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with Euphorik. If not, see . % % This module responds to JSON requests via 'AJAX'. % It's defined as an Yaws 'appmods' with the url '/request'. % For instance in debug mode 'http://localhost:8090/request' will call the out/1 function. -module(euphorik_requests). -author("Greg Burri "). -export([out/1]). -include_lib("yaws_api.hrl"). -include("../include/euphorik_defines.hrl"). % Entry point for all AJAX requests on '/request'. out(A) -> IP = case inet:peername(A#arg.clisock) of {ok, {Address, _Port}} -> Address; _ -> unknown end, % active: to receive {tcp_closed, _} when the socket is closing. % keepalive: avoid firewalls to cut the connection. inet:setopts(A#arg.clisock, [{active, true}, {keepalive, true}]), {value, {_, Contenu}} = lists:keysearch("action", 1, yaws_api:parse_post(A)), Ret = traiter_message(Contenu, IP), {content, "application/json", Ret}. % Décode le message JSON. traiter_message(Contenu, IP) -> % extrait l'entête obligatoire des messages JSON {ok, {struct, [{"header", {struct, [{"action", Action}, {"version", Version_client}]}} | Reste]}} = json2:decode_string(Contenu), json2:encode( if Version_client =:= ?VERSION_PROTOCOLE -> traiter_action(Action, Reste, IP); true -> euphorik_protocole:erreur(lists:flatten(io_lib:format( "La version du protocole du client (~w) ne correspond à celle du serveur (~w)", [Version_client, ?VERSION_PROTOCOLE] ))) end ). % Authentification d'un client. traiter_action("authentification", JSON, IP) -> euphorik_protocole:login(JSON, IP); % Un client s'enregistre : (pseudo + password) ou de manière anonyme. traiter_action("register", JSON, IP) -> euphorik_protocole:register(JSON, IP); % Modification du profile. traiter_action("set_profile", JSON, _) -> euphorik_protocole:profile(JSON); % Un utilisateur attend un événement (par exemple l'arrivée d'un nouveau message). traiter_action("wait_event", JSON, _) -> euphorik_protocole:wait_event(JSON); % Un utilisateur envoie un message. traiter_action("put_message", JSON, _) -> euphorik_protocole:put_message(JSON); % Un ekMaster bannie un utilisateur (ip). traiter_action("ban", JSON, _) -> euphorik_protocole:ban(JSON); % Un ekMaster slap un utilisateur. traiter_action("slap", JSON, _) -> euphorik_protocole:slap(JSON); % Un ekMaster demande la liste des ips bannies. traiter_action("list_banned_ips", JSON, _) -> euphorik_protocole:list_banned_ips(JSON); % Un ekMaster débannie une ip. traiter_action("unban", JSON, _) -> euphorik_protocole:unban_ip(JSON).