index.erl 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. -module(index).
  2. -description('MQTT Application').
  3. -compile(export_all).
  4. -include_lib("kvs/include/entry.hrl").
  5. -include_lib("nitro/include/nitro.hrl").
  6. -include_lib("n2o/include/n2o.hrl").
  7. event(init) ->
  8. nitro:wire("nodes="++nitro:to_list(length(n2o:ring()))++";"),
  9. #cx{session=Token,params=Id,node=Node} = get(context),
  10. Room = n2o:session(room),
  11. nitro:update(logout, #button { id=logout, body="Logout " ++ n2o:user(), postback=logout}),
  12. nitro:update(send, #button { id=send, body="Chat", source=[message], postback=chat}),
  13. nitro:update(heading, #h2 { id=heading, body=Room}),
  14. nitro:update(upload, #upload { id=attach }),
  15. nitro:wire("mqtt.subscribe('room/"++Room++"',subscribeOptions);"),
  16. Topic = iolist_to_binary(["events/1/",Node,"/index/anon/",Id,"/",Token]),
  17. n2o_vnode:send_reply(<<>>, 2, Topic, term_to_binary(#client{data={Room,list}})),
  18. io:format("Room: ~p~n",[Room]),
  19. nitro:wire(#jq{target=message,method=[focus,select]});
  20. event(chat) ->
  21. User = n2o:user(),
  22. Message = nitro:q(message),
  23. Room = n2o:session(room),
  24. io:format("Chat pressed: ~p\r~n",[{Room,Message,User}]),
  25. #cx{session=ClientId} = get(context),
  26. kvs:add(#entry{id=kvs:next_id("entry",1),
  27. from=n2o:user(),feed_id={room,Room},media=Message}),
  28. nitro:insert_top(history, nitro:jse(message_view(User,Message))),
  29. Actions = iolist_to_binary(n2o_nitro:render_actions(nitro:actions())),
  30. M = term_to_binary({io,Actions,<<>>}),
  31. n2o_vnode:send_reply(ClientId, 2, iolist_to_binary([<<"room/">>,Room]), M);
  32. event(#client{data={Room,list}}) ->
  33. [ nitro:insert_top(history, nitro:jse(message_view(E#entry.from,E#entry.media)))
  34. || E <- lists:reverse(kvs:entries(kvs:get(feed,{room,Room}),entry,30)) ];
  35. event(#ftp{sid=_Sid,filename=Filename,status={event,init}}=Data) ->
  36. ok;
  37. event(#ftp{sid=_Sid,filename=Filename,status={event,stop}}=Data) ->
  38. Name = hd(lists:reverse(string:tokens(nitro:to_list(Filename),"/"))),
  39. IP = application:get_env(sample,host,"127.0.0.1"),
  40. erlang:put(message,
  41. nitro:render(#link{href=iolist_to_binary(["http://",IP,":8000/n2o/",
  42. nitro_conv:url_encode(Name)]),body=Name})),
  43. event(chat);
  44. event(logout) -> nitro:redirect("/login.htm"), n2o:session(room,[]);
  45. event(Event) -> io:format("Event: ~p", [Event]).
  46. message_view(User,Message) ->
  47. iolist_to_binary(["<message><author>",User,"</author>",Message,"</message>"]).
  48. main() -> [].