{"id":3070,"date":"2017-06-24T12:34:26","date_gmt":"2017-06-24T16:34:26","guid":{"rendered":"http:\/\/linguagemprisma.br4.biz\/blog\/?p=3070"},"modified":"2017-06-26T20:36:22","modified_gmt":"2017-06-27T00:36:22","slug":"mini-messenger-em-prisma-ig-igrede","status":"publish","type":"post","link":"https:\/\/linguagemprisma.br4.biz\/blog\/igprisma\/mini-messenger-em-prisma-ig-igrede\/","title":{"rendered":"Mini messenger em Prisma + ig + igRede"},"content":{"rendered":"<p>Fiz um mensageiro instant\u00e2neo bem b\u00e1sico, s\u00f3 para servir de modelo mesmo.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-3075\" src=\"https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/06\/igmsg-300x197.png\" alt=\"igmsg\" width=\"300\" height=\"197\" srcset=\"https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/06\/igmsg-300x197.png 300w, https:\/\/linguagemprisma.br4.biz\/blog\/wp-content\/uploads\/2017\/06\/igmsg.png 502w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p><em><strong>PS.: Fiz uma corre\u00e7\u00e3o no c\u00f3digo em rela\u00e7\u00e3o a vari\u00e1vel porta destino, dava erro e fechamento do programa. (25\/06 &#8211; 22h);\u00a0<\/strong><\/em><\/p>\n<p><em><strong>PS.: Novamente corrigido, havia outros erros, c\u00f3digo modificado 26\/06\/17 19:09. Na verdade olhando bem, ainda tem uns bugs e vendo o manual de refer\u00eancia do c\u00f3digo C percebi que preciso mexer na lib igrede para acrescentar mais fun\u00e7\u00f5es importantes, farei isso futuramente.<\/strong><\/em><\/p>\n<p>Segue a \u00faltima modifica\u00e7\u00e3o que fiz:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:prisma decode:true\">\/*Programa Mini messenger em Prisma + igbr + igrede\r\n * \r\n * Licen\u00e7a: MIT\r\n * \r\n Permission is hereby granted, free of charge, to any person obtaining a copy of this \r\n software and associated documentation files (the \"Software\"), to deal in the Software \r\n without restriction, including without limitation the rights to use, copy, modify, merge, \r\n publish, distribute, sublicense, and\/or sell copies of the Software, and to permit persons \r\n to whom the Software is furnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all \r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, \r\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR \r\nPURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE \r\nFOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, \r\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS \r\nIN THE SOFTWARE. \r\n *\/\r\n \r\nlocal _Versao_ = '0.2';\r\n\r\nlocal _Sobre_ = \r\n'Mini mensageiro instant\u00e2neo feito em \\\r\nPrisma-1.0.100';\r\n\r\nlocal ig = inclua'igbr';\r\nlocal rede = inclua'igrede';\r\n\r\nfuncao principal(arg)\r\n  local t = interface(); \r\n  t.BLOCO_TAM = '1000000'; \/\/1MB aproxim. \r\n  ig.loop(); \/\/o mesmo que ig.fimprograma() use qual preferir.\r\n  se t.servidor entao\r\n    rede.servidor_pare(t.servidor);\r\n  fim\r\n  se t.cliente entao\r\n    ig.objeto_desref(t.cliente);\/\/desreferencia o objeto, ou seja, limpa a mem\u00f3ria.\r\n  fim\r\n  retorne 0;\r\nfim \r\n\r\nfuncao obt_ip_porta(s)\r\n    local url = s:analise(':'); \/\/os dois pontos separa o ip da porta lembra?\r\n    se nao url entao \r\n      retorne falso, \"\\nErro: Ip ou porta invalida\";\r\n    fim;\/\/abandona a funcao imprimindo o erro.\r\n    local ip = url[1];\r\n    local porta = url[3];\/\/o [2] \u00e9 o `:';\r\n    retorne {ip=ip,porta=porta};\r\nfim\r\n\r\nfuncao processe_msg(s)\r\n    local dado = s:analise('\\002'); \/\/o ascii code 2 separa o cabe\u00e7alho de informa\u00e7\u00e3o da msg.\r\n    se nao dado entao \r\n      retorne falso, \"\\nErro: Ip ou porta invalida\";\r\n    fim;\/\/abandona a funcao imprimindo o erro.\r\n    local url = dado[1]\r\n    local msg = dado[3];\/\/o [2] \u00e9 o `:';\r\n    retorne {url=url,msg=msg};\r\nfim\r\n\r\nfuncao interface()\r\n  local t = {}; \/\/criando a tabela de componentes.\r\n  t.jan = ig.janela('igMensageiro ' .. _Versao_ ou '' ,500,300);\r\n  ig.caixa_def_borda_largura(t.jan,12);\r\n  ig.conecte_funcao(t.jan,ig.destruido,ig.fimjanela);\r\n  t.cv = ig.caixavertical();\r\n  t.txt_ip_local = ig.texto('127.0.0.1:2345');\/\/modifique para o ip e portas desejados.\r\n  t.txt_ip_destino= ig.texto('127.0.0.1:2345');\r\n  t.area_txt = ig.texto_area();\r\n  t.txt_enviar=ig.texto_area(); ig.componente_def_tamanho(t.txt_enviar,400,80);\r\n  t.bt_enviar=ig.botao' Enviar';\r\n  ig.conecte_funcao(t.bt_enviar,ig.clique,envie_msg, t);\r\n  ig.ad(t.jan,t.cv);\r\n  t.bt_ligar_desligar_servidor = ig.botao_checagem(' Ligar servidor');\r\n  ig.conecte_funcao(t.bt_ligar_desligar_servidor,ig.marcado,ligar_desligar_servidor,t);\r\n  ad_elementos(t,ig.rotulo' Ip:porta local:      ',t.txt_ip_local,t.bt_ligar_desligar_servidor);\r\n  ad_elementos(t,ig.rotulo' Ip:porta destino:  ',t.txt_ip_destino);\r\n  ad_elementos(t,t.txt_enviar,t.bt_enviar);\r\n  ig.caixa_ad(t.cv,ig.separadorhorizontal(),falso,falso,0);\r\n  ad_elementos(t,ig.rotulo'Mensagens enviadas e recebidas:');\r\n  t.jan_rolagem=ig.janela_rolagem();\r\n  ig.janela_rolagem_ad(t.jan_rolagem,t.area_txt);\r\n  ig.ad(t.cv,t.jan_rolagem);\r\n  t.avisos = ig.rotulo'Avisos: servidor desligado!';\r\n  ad_elementos(t,t.avisos);\r\n  \r\n  ig.componente_def_foco(t.bt_enviar);\/\/coloca foco no bot\u00e3o enviar\r\n  ig.componente_mostre_todos(t.jan);\r\n  retorne t;  \r\nfim \r\n\r\nfuncao ligar_desligar_servidor(bt,t)\r\n  se ig.botao_seletor_obt_ativo(bt) == verdadeiro entao \/\/retorno verdadeiro est\u00e1 ligado\r\n    ig.botao_def_rotulo(bt,' Desligar servidor');\r\n    se nao t.servidor entao\r\n      crie_servidor(t);\/\/cria e inicia o servidor!\r\n    senao\r\n      rede.servidor_inicie(t.servidor);\r\n    fim\r\n  senao\r\n    ig.botao_def_rotulo(bt,' Ligar servidor');\r\n    rede.servidor_pare(t.servidor);\/\/entao para o servidor.  \r\n    ig.rotulo_def_texto(t.avisos,'Avisos: servidor desligado!');\r\n    imprima('Avisos: servidor desligado!');  \r\n  fim\r\nfim\r\n\r\nfuncao ad_elementos(t,...)\r\n  local ch = ig.caixahorizontal();\r\n  local elementos = {...};\/\/pega o parametro variado e transforma em tabela.\r\n  para i,v em ipares(elementos) inicio\r\n    ig.caixa_ad(ch,v,falso,falso,0);\/\/coloca cada componente da tabela na caixa horizontal.\r\n  fim\r\n  ig.caixa_ad(t.cv,ch,falso,falso,0);\r\nfim\r\n\r\n\r\nfuncao envie_msg(bt,t)\/\/em prisma podemos fazer uma fun\u00e7\u00e3o dentro de outra normalmente.\r\n    se nao t.cliente entao\r\n      t.cliente = rede.cliente(); \r\n    fim\r\n    imprima('Aguarde...');\r\n    local destino = ig.texto_obt_texto(t.txt_ip_destino);     \r\n    local sdest,err = obt_ip_porta(destino); \/\/essa fun\u00e7\u00e3o analisa a url e retorna ip e porta separados em tabela\r\n    se nao sdest entao poe(err);fim;\/\/abandona a funcao imprimindo o erro.\r\n  \r\n    local conexao , erro_msg = \r\n    rede.cliente_conecte_com_servidor(\/\/parametros:\r\n        t.cliente,\r\n        sdest.ip, \/\/ip local\r\n        sdest.porta\/\/porta de conexao\r\n    );  \r\n    \r\n    se nao conexao entao\r\n       imprima( erro_msg,'\\nConexao rejeitada, servidor desligado?' );\r\n       ig.rotulo_def_texto(t.avisos,'Avisos: \\n' .. erro_msg);\r\n    senao\r\n       local ms = ig.texto_area_obt_texto(t.txt_enviar);\r\n       s = ig.texto_obt_texto(t.txt_ip_local) .. '\\002' .. ms; \r\n       erro_msg = rede.escreva( conexao , s  );\/\/mandando a mensagem.\r\n       se erro_msg entao \r\n         imprima(erro_msg); \r\n         ig.rotulo_def_texto(t.avisos,'Avisos: \\n' .. erro_msg);\r\n       senao\r\n         local conteudo = ig.texto_area_obt_texto(t.area_txt);  \r\n          destino = destino .. ' em ' .. sis.data('%d\/%m\/%y - %H:%M');       \r\n         ig.texto_area_def_texto(t.area_txt,'Enviado para: '.. destino ..' :\\n  ' .. ms .. '\\n'.. string.nconcat('_',100) .. '\\n' .. conteudo);\r\n       fim\r\n    fim\r\nfim\r\n  \r\n\r\nfuncao crie_servidor(t)\r\n   local servidor = rede.servidor();\r\n   t.servidor = servidor;\/\/colocando a variavel na tabela de componentes\r\n   local url = ig.texto_obt_texto(t.txt_ip_local);\r\n   local host = obt_ip_porta(url);\r\n   local ret, erro_msg = rede.escute_porta(servidor,host.porta);\r\n   se ret == falso entao\r\n         imprima(erro_msg);\r\n         ig.rotulo_def_texto(t.avisos,'Avisos: ' .. erro_msg);\r\n   senao\r\n     ig.conecte_funcao(servidor,ig.recebido, func_servidor,t);\r\n     imprima('Servidor ativo,', url ou '');  \r\n     ig.rotulo_def_texto(t.avisos,'Avisos: servidor ativo, ' .. url ou '');\r\n   fim\r\nfim\r\n\r\nfuncao ao_ler(mensagem,t)\r\n   imprima(\"Cliente: \" .. mensagem);\r\n   local info = processe_msg(mensagem); \r\n   local conteudo = ig.texto_area_obt_texto(t.area_txt);  \r\n   info.url = info.url .. ' em ' .. sis.data('%d\/%m\/%y - %H:%M');      \r\n   ig.texto_area_def_texto(t.area_txt,'\\nRecebido de: '.. info.url ..' :\\n  ' .. info.msg .. ' \\n' .. string.nconcat('_',100) .. '\\n' .. conteudo .. '\\n' );\r\n   ig.rotulo_def_texto(t.avisos,\"Avisos: conex\u00e3o recebida \" .. info.url ou '');\r\n   ig.objeto_desref(t.conexao);\r\nfim\r\n\r\nfuncao func_servidor( servidor,conexao, Gobjeto, t)\r\n   imprima(\"Conexao recebida de cliente\\n\");\r\n   t.conexao = ig.objeto_ref(conexao);\r\n   rede.leia_assinc( conexao,t.BLOCO_TAM, ao_ler,t);\r\nfim\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Bom, \u00e9 isso, espero que seja \u00fatil.<\/p>\n<p>&nbsp;<\/p>\n<p>Falou at\u00e9 mais.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fiz um mensageiro instant\u00e2neo bem b\u00e1sico, s\u00f3 para servir de modelo mesmo. PS.: Fiz uma corre\u00e7\u00e3o no c\u00f3digo em rela\u00e7\u00e3o a vari\u00e1vel porta destino, dava erro e fechamento do programa. (25\/06 &#8211; 22h);\u00a0 PS.: Novamente corrigido, havia outros erros, c\u00f3digo modificado 26\/06\/17 19:09. Na verdade olhando bem, ainda tem uns bugs e vendo o manual&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,22],"tags":[],"class_list":["post-3070","post","type-post","status-publish","format-standard","hentry","category-igprisma","category-rede"],"_links":{"self":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3070","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/comments?post=3070"}],"version-history":[{"count":5,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3070\/revisions"}],"predecessor-version":[{"id":3076,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3070\/revisions\/3076"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=3070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/categories?post=3070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/tags?post=3070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}