Browse Source

unicode chat messaging

Maxim Sokhatsky 11 years ago
parent
commit
27b947265e

+ 14 - 0
apps/web/priv/static/app/js/bert.js

@@ -145,3 +145,17 @@ function de_tuple(S, Count) {
     for (i = 0; i < Size; i++) { El = de_inner(S); Arr.push(El.value); S = El.rest; }
     return { value: tuple(Arr), rest: S }; };
 function de_nil(S) { return { value: [], rest: S }; };
+
+function utf8toByteArray(str) {
+    var byteArray = [];
+    if (str !== undefined && str !== null)
+    for (var i = 0; i < str.length; i++)
+        if (str.charCodeAt(i) <= 0x7F)
+            byteArray.push(str.charCodeAt(i));
+        else {
+            var h = encodeURIComponent(str.charAt(i)).substr(1).split('%');
+            for (var j = 0; j < h.length; j++)
+                byteArray.push(parseInt(h[j], 16));
+        }
+    return byteArray;
+};

+ 10 - 5
apps/web/priv/static/app/js/chat.js

@@ -71,7 +71,7 @@ function chatMessage(chatName, id, me, string) {
     var y2 = textElement.getBBox().height + 5;
     var box = "<path xmlns:data='"+container+"' xmlns='http://www.w3.org/2000/svg' d='M"+x1+","+y1+
                 " L"+x2+","+y1+
-            ((me == "Maxim") ?
+            ((me == document.user) ?
                 (" L"+x2+","+parseFloat(y2-7)+
                 " L"+parseFloat(x2+7)+","+y2+
                 " L"+x1+","+y2)
@@ -79,7 +79,7 @@ function chatMessage(chatName, id, me, string) {
                 (" L"+x2+","+y2+
                 " L"+0+","+y2+
                 " L"+x1+","+parseFloat(y2-7)))
-        + " L"+x1+","+y1+"' fill='"+colors[me=="Maxim"?1:0]+"'></path>";
+        + " L"+x1+","+y1+"' fill='"+colors[me==document.user?1:0]+"'></path>";
     var boxElement = svg(box);
     textElement.setAttribute("xmlns:data",container)
     messageElement.insertBefore(boxElement,textElement);
@@ -287,13 +287,18 @@ function chatEditor(evt) {
         var e = evt.target;
         if (e.innerText.trim() != ""){
             var text = e.innerText.trim().encodeHTML();
-            chatMessage(chatContainer,"100","Maxim",text);
+            console.log("OutputMessage " + utf8toByteArray(text));
+            chatMessage(chatContainer,"100",document.user,text);
                 ws.send(enc(tuple(atom('client'),
-                    tuple(atom('message'),bin(document.user),bin(chatContainer.substr(5)),bin(text)))));
+                    tuple(atom('message'),
+                          bin(document.user),
+                          bin(document.names),
+                          bin(chatContainer.substr(5)),
+                          utf8toByteArray(text)))));
             e.innerHTML = '';
         }
     } else if (evt.keyCode == 13 && evt.altKey == true) {
-        document.execCommand('insertText',false, '\n');
+//        document.execCommand('insertText',false, '\n');
     }
     var scroll = -100000;
     if (null != currentChat) { left_scroll = scroll; }

+ 13 - 0
apps/web/priv/static/app/js/roster.js

@@ -38,6 +38,19 @@ function RosterHandlers(scope) {
         showOnlineList();
     });
 
+    scope.apiProvider.on("chat_message", function (x) {
+        var e = {detail: x.detail.json, raw: x.detail.bert};
+        var from = dec(e.raw).value[0][1].value[0][0].value,
+            names = dec(e.raw).value[0][1].value[0][1].value,
+            to = dec(e.raw).value[0][2].value,
+            message = dec(e.raw).value[0][3];
+        console.log(message);
+        chatMessage(currentChat,"1",from==document.user?"Self":from,/*names+":\n"+*/message);
+        onlineHover();
+        mouseWheelHandler({'detail':-10000,'wheelDelta':-10000});
+        onlineHoverOut();
+    });
+
     scope.apiProvider.on("roster_group", function (x) {
         var e = {detail: x.detail.json, raw: x.detail.bert};
         var list = dec(e.raw).value[0][1];

+ 5 - 4
apps/web/src/okey.erl

@@ -188,7 +188,8 @@ event(attach) ->
     send_roster(),
     wf:info(?MODULE,"Games Online: ~p",[game:online()]),
     put(okey_im, User#user.id),
-    wf:wire(wf:f("document.user = '~s';",[User#user.id])),
+    wf:wire(wf:f("document.user = '~s';document.names = '~s';document.surnames = '~s';",
+                        [User#user.id,User#user.names,User#user.surnames])),
     wf:info(?MODULE,"Session User: ~p",[User]),
     GameId = case wf:q(games_ids) of undefined -> ?GAMEID; Res -> Res end,
     put(okey_game_id, GameId),
@@ -251,9 +252,9 @@ event(pause) ->
 
 %event({binary,M}) -> {ok,<<"Hello">>};
 
-event({client,{message,From,To,Message}}) ->
-    wf:info(?MODULE,"Chat Message from ~p to ~p:~n ~p~n",[From,To,Message]),
-    wf:send(To,{server,{chat_message,From,To,Message}}),
+event({client,{message,From,Name,To,Message}}) ->
+    wf:info(?MODULE,"Chat Message from ~p(~p) to ~p:~n ~p~n",[From,Name,To,Message]),
+    wf:send(To,{server,{chat_message,{From,Name},To,unicode:characters_to_binary(Message)}}),
     ok;
 
 event({client,Message}) ->

+ 1 - 1
otp.mk

@@ -25,7 +25,7 @@ delete-deps get-deps compile clean update-deps:
 $(RUN_DIR) $(LOG_DIR):
 	mkdir -p $(RUN_DIR) & mkdir -p $(LOG_DIR)
 console: .applist
-	ERL_LIBS=$(ERL_LIBS) erl $(ERL_ARGS) -eval '[application:start(A) || A <- $(shell cat .applist)]'
+	ERL_LIBS=$(ERL_LIBS) erl +pc unicode $(ERL_ARGS) -eval '[application:start(A) || A <- $(shell cat .applist)]'
 start: $(RUN_DIR) $(LOG_DIR) .applist
 	RUN_ERL_LOG_GENERATIONS=1000 RUN_ERL_LOG_MAXSIZE=20000000 \
 	ERL_LIBS=$(ERL_LIBS) run_erl -daemon $(RUN_DIR)/ $(LOG_DIR)/ "exec $(MAKE) console"