GLaDOS V5
Posté le 28/10/2020 22:56
Hey !
Comme vous le savez la version 5 de Planète Casio est dans les cartons. Entre autres nouveauté un nouveau chat qui se fera non plus par la traditionnelle shoutbox mais via un serveur IRC. Nouveau chat implique nouvelle version de GLaDOS !
Je me propose pour faire la nouvelle GLaDOS, codée en Python pour V5.
J'aurais du coup besoin d'info… j'ai commencé à chercher un peu, le plus simple est de faire une lib maison pour connecter GLaDOS à IRC, lire et envoyer des messages. J'étais parti avec
socket mais j'ai aussi besoin des certificats SSL et des authentifications SASL… J'avoue que je comprends pas trop les docs de pyOpenSSL
Merci d'avance !
Idées de commandes
Si vous en avez d'autres, hésitez pas à les proposer en commentaires
Commandes et messages prévus :
- Notification de création de topic
- Notification de nouveau message sur un topic
- Notification de publication d'un programme
- Notification de nouveau message sur un programme
- Kick / Unckick (non publique)
- Ban / Deban (non publique)
- Message custom (réservée au staff)
( - Recherche sommaire sur Wikipédia)
( - Traduction de mots)
( - Base de chatbot)
Commandes implémentées :
-
Citer : Posté le 29/10/2020 08:04 | #
j'ai vécu aussi ce problème le HTTP c'est facile ,
mais le HTTPS c'est l'enfer
surtout CURL, ça marche très bien en HTTP mais il y a une tas de config a faire pour chaque requêtes HTTPS; et la ça va encore mais les certificats SSL !!!
Citer : Posté le 29/10/2020 08:13 | #
Almost like HTTP is easy because it's not secure...
Citer : Posté le 29/10/2020 08:18 | #
je sais mais j'ai la solution!
il y a le module REQUESTS
en une commande 'get()' et on a on objet qui contient tout! status ,le str de la réponse , etc...
ex:
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from requests import *
>>> get("https://google.com")
<Response [200]>
>>> get("https://google.com").text
'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="fr"><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script nonce="yZes0b21NzyAyVmlqe+tNw==">(function(){window.google={kEI:\'mmyaX-fQFYiRlwTFpL3oDA\',kEXPI:\'0,202162,1151585,5662,731,223,5105,206,3204,10,1226,364,1499,611,206,383,246,5,1354,648,3451,315,3,65,595,174,216,283,868,114,451,416,318,17,143,7,2422,265,7,131,564,1116293,1197736,546,328985,13677,4855,32692,16114,2236,15208,11240,9188,8384,4858,1362,9291,3028,2816,1923,2136,8895,3,1807,4020,978,7931,5297,2054,920,873,4192,6430,14527,4517,1399,1379,919,2277,8,2796,887,706,1279,2212,530,149,1103,840,519,511,953,56,4258,312,1137,2,2063,606,2023,1777,520,1947,2229,93,328,1284,16,2927,2247,1812,1787,2273,1,953,419,2426,7,5599,6754,4455,642,599,6941,337,4928,108,3407,908,2,941,2614,2397,10745,3,576,970,865,8,4616,149,3026,476,2488,7985,1,1,2,1528,2304,1236,271,874,406,251,1608,2393,1510,281,52,976,1401,463,460,1555,4067,1035,1316,3,2108,1172,1426,69,305,2110,200,1514,1043,254,1409,344,690,1968,4243,518,912,564,689,431,30,1303,2550,131,9,642,2452,990,52,3030,255,2214,850,83,1372,638,666,828,130,360,115,2,213,359,3,907,93,2054,1350,2361,55,745,3798,39,170,606,2,72,705,104,59,260,404,413,11,731,43,21,601,113,210,14,1356,454,112,167,1119,16,75,1422,766,133,693,464,703,39,200,301,60,272,147,507,3,172,886,514,335,834,341,23,35,242,196,434,72,899,223,87,5,1182,621,92,144,25,615,4,121,585,1104,819,91,1,336,502,311,145,5742121,13,1861,1833,8798209,549,333,444,1,2,80,1,900,896,1,9,2,2551,1,748,141,59,736,563,1,4265,1,1,2,1017,9,305,3299,248,596,998,36,13,7,16,73,26,4,21,67,65,4,2,6,3,9,8,5,4,10,48,11,55,28,2,5,23958735,2716137,1984\',kBL:\'EpvJ\'};google.sn=\'webhp\';google.kHL=\'fr\';})();(function(){google.lc=[];google.li=0;google.getEI=function(a){for(var c;a&&(!a.getAttribute||!(c=a.getAttribute("eid")));)a=a.parentNode;return c||google.kEI};google.getLEI=function(a){for(var c=null;a&&(!a.getAttribute||!(c=a.getAttribute("leid")));)a=a.parentNode;return c};google.ml=function(){return null};google.time=function(){return Date.now()};google.log=function(a,c,b,d,g){if(b=google.logUrl(a,c,b,d,g)){a=new Image;var e=google.lc,f=google.li;e[f]=a;a.onerror=a.onload=a.onabort=function(){delete e[f]};google.vel&&google.vel.lu&&google.vel.lu(b);a.src=b;google.li=f+1}};google.logUrl=function(a,c,b,d,g){var e="",f=google.ls||"";b||-1!=c.search("&ei=")||(e="&ei="+google.getEI(d),-1==c.search("&lei=")&&(d=google.getLEI(d))&&(e+="&lei="+d));d="";!b&&google.cshid&&-1==c.search("&cshid=")&&"slh"!=a&&(d="&cshid="+google.cshid);b=b||"/"+(g||"gen_204")+"?atyp=i&ct="+a+"&cad="+c+e+f+"&zx="+google.time()+d;/^http:/i.test(b)&&"https:"==window.location.protocol&&(google.ml(Error("a"),!1,{src:b,glmm:1}),b="");return b};}).call(this);(function(){google.y={};google.x=function(a,b){if(a)var c=a.id;else{do c=Math.random();while(google.y[c])}google.y[c]=[a,b];return!1};google.lm=[];google.plm=function(a){google.lm.push.apply(google.lm,a)};google.lq=[];google.load=function(a,b,c){google.lq.push([[a],b,c])};google.loadAll=function(a,b){google.lq.push([a,b])};}).call(this);google.f={};(function(){\ndocument.documentElement.addEventListener("submit",function(b){var a;if(a=b.target){var c=a.getAttribute("data-submitfalse");a="1"==c||"q"==c&&!a.elements.q.value?!0:!1}else a=!1;a&&(b.preventDefault(),b.stopPropagation())},!0);document.documentElement.addEventListener("click",function(b){var a;a:{for(a=b.target;a&&a!=document.documentElement;a=a.parentElement)if("A"==a.tagName){a="1"==a.getAttribute("data-nohref");break a}a=!1}a&&b.preventDefault()},!0);}).call(this);\nvar a=window.location,b=a.href.indexOf("#");if(0<=b){var c=a.href.substring(b+1);/(^|&)q=/.test(c)&&-1==c.indexOf("#")&&a.replace("/search?"+c.replace(/(^|&)fp=[^&]*/g,"")+"&cad=h")};</script><style>#gbar,#guser{font-size:13px;padding-top:1px !important;}#gbar{height:22px}#guser{padding-bottom:7px !important;text-align:right}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}@media all{.gb1{height:22px;margin-right:.5em;vertical-align:top}#gbar{float:left}}a.gb1,a.gb4{text-decoration:underline !important}a.gb1,a.gb4{color:#00c !important}.gbi .gb4{color:#dd8e27 !important}.gbf .gb4{color:#900 !important}\n</style><style>body,td,a,p,.h{font-family:arial,sans-serif}body{margin:0;overflow-y:scroll}#gog{padding:3px 8px 0}td{line-height:.8em}.gac_m td{line-height:17px}form{margin-bottom:20px}.h{color:#36c}.q{color:#00c}em{font-weight:bold;font-style:normal}.lst{height:25px;width:496px}.gsfi,.lst{font:18px arial,sans-serif}.gsfs{font:17px arial,sans-serif}.ds{display:inline-box;display:inline-block;margin:3px 0 4px;margin-left:4px}input{font-family:inherit}body{background:#fff;color:#000}a{color:#11c;text-decoration:none}a:hover,a:active{text-decoration:underline}.fl a{color:#36c}a:visited{color:#551a8b}.sblc{padding-top:5px}.sblc a{display:block;margin:2px 0;margin-left:13px;font-size:11px}.lsbb{background:#eee;border:solid 1px;border-color:#ccc #999 #999 #ccc;height:30px}.lsbb{display:block}#WqQANb a{display:inline-block;margin:0 12px}.lsb{background:url(/images/nav_logo229.png) 0 -261px repeat-x;border:none;color:#000;cursor:pointer;height:30px;margin:0;outline:0;font:15px arial,sans-serif;vertical-align:top}.lsb:active{background:#ccc}.lst:focus{outline:none}</style><script nonce="yZes0b21NzyAyVmlqe+tNw=="></script></head><body bgcolor="#fff"><script nonce="yZes0b21NzyAyVmlqe+tNw==">(function(){var src=\'/images/nav_logo229.png\';var iesg=false;document.body.onload = function(){window.n && window.n();if (document.images){new Image().src=src;}\nif (!iesg){document.f&&document.f.q.focus();document.gbqf&&document.gbqf.q.focus();}\n}\n})();</script><div id="mngb"><div id=gbar><nobr><b class=gb1>Recherche</b> <a class=gb1 href="https://www.google.fr/imghp?hl=fr&tab=wi">Images</a> <a class=gb1 href="https://maps.google.fr/maps?hl=fr&tab=wl">Maps</a> <a class=gb1 href="https://play.google.com/?hl=fr&tab=w8">Play</a> <a class=gb1 href="https://www.youtube.com/?gl=FR&tab=w1">YouTube</a> <a class=gb1 href="https://news.google.com/?tab=wn">Actualités</a> <a class=gb1 href="https://mail.google.com/mail/?tab=wm">Gmail</a> <a class=gb1 href="https://drive.google.com/?tab=wo">Drive</a> <a class=gb1 style="text-decoration:none" href="https://www.google.fr/intl/fr/about/products?tab=wh"><u>Plus</u> »</a></nobr></div><div id=guser width=100%><nobr><span id=gbn class=gbi></span><span id=gbf class=gbf></span><span id=gbe></span><a href="http://www.google.fr/history/optout?hl=fr" class=gb4>Historique Web</a> | <a href="/preferences?hl=fr" class=gb4>Paramètres</a> | <a target=_top id=gb_70 href="https://accounts.google.com/ServiceLogin?hl=fr&passive=true&continue=https://www.google.com/&ec=GAZAAQ" class=gb4>Connexion</a></nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div></div><center><br clear="all" id="lgpd"><div id="lga"><img alt="Google" height="92" src="/images/branding/googlelogo/1x/googlelogo_white_background_color_272x92dp.png" style="padding:28px 0 14px" width="272" id="hplogo"><br><br></div><form action="/search" name="f"><table cellpadding="0" cellspacing="0"><tr valign="top"><td width="25%"> </td><td align="center" nowrap=""><input name="ie" value="ISO-8859-1" type="hidden"><input value="fr" name="hl" type="hidden"><input name="source" type="hidden" value="hp"><input name="biw" type="hidden"><input name="bih" type="hidden"><div class="ds" style="height:32px;margin:4px 0"><input class="lst" style="margin:0;padding:5px 8px 0 6px;vertical-align:top;color:#000" autocomplete="off" value="" title="Recherche Google" maxlength="2048" name="q" size="57"></div><br style="line-height:0"><span class="ds"><span class="lsbb"><input class="lsb" value="Recherche Google" name="btnG" type="submit"></span></span><span class="ds"><span class="lsbb"><input class="lsb" id="tsuid1" value="J\'ai de la chance" name="btnI" type="submit"><script nonce="yZes0b21NzyAyVmlqe+tNw==">(function(){var id=\'tsuid1\';document.getElementById(id).onclick = function(){if (this.form.q.value){this.checked = 1;if (this.form.iflsig)this.form.iflsig.disabled = false;}\nelse top.location=\'/doodles/\';};})();</script><input value="AINFCbYAAAAAX5p6qvGCgU2b2-93eC8gXkJqpHUZ_ZZ2" name="iflsig" type="hidden"></span></span></td><td class="fl sblc" align="left" nowrap="" width="25%"><a href="/advanced_search?hl=fr&authuser=0">Recherche avancée</a></td></tr></table><input id="gbv" name="gbv" type="hidden" value="1"><script nonce="yZes0b21NzyAyVmlqe+tNw==">(function(){var a,b="1";if(document&&document.getElementById)if("undefined"!=typeof XMLHttpRequest)b="2";else if("undefined"!=typeof ActiveXObject){var c,d,e=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];for(c=0;d=e[c++];)try{new ActiveXObject(d),b="2"}catch(h){}}a=b;if("2"==a&&-1==location.search.indexOf("&gbv=2")){var f=google.gbvu,g=document.getElementById("gbv");g&&(g.value=a);f&&window.setTimeout(function(){location.href=f},0)};}).call(this);</script></form><div id="gac_scont"></div><div style="font-size:83%;min-height:3.5em"><br></div><span id="footer"><div style="font-size:10pt"><div style="margin:19px auto;text-align:center" id="WqQANb"><a href="/intl/fr/ads/">Solutions publicitaires</a><a href="/services/">Solutions d\'entreprise</a><a href="/intl/fr/about.html">À propos de Google</a><a href="https://www.google.com/setprefdomain?prefdom=FR&prev=https://www.google.fr/&sig=K_1rH_GjFdhBjjJNebhdIegnUzC3s%3D">Google.fr</a></div></div><p style="font-size:8pt;color:#767676">© 2020 - <a href="/intl/fr/policies/privacy/">Confidentialité</a> - <a href="/intl/fr/policies/terms/">Conditions</a></p></span></center><script nonce="yZes0b21NzyAyVmlqe+tNw==">(function(){window.google.cdo={height:0,width:0};(function(){var a=window.innerWidth,b=window.innerHeight;if(!a||!b){var c=window.document,d="CSS1Compat"==c.compatMode?c.documentElement:c.body;a=d.clientWidth;b=d.clientHeight}a&&b&&(a!=google.cdo.width||b!=google.cdo.height)&&google.log("","","/client_204?&atyp=i&biw="+a+"&bih="+b+"&ei="+google.kEI);}).call(this);})();(function(){var u=\'/xjs/_/js/k\\x3dxjs.hp.en.U435xAUT4m0.O/m\\x3dsb_he,d/am\\x3dADxBHA/d\\x3d1/rs\\x3dACT90oHghdanrNYJ9NN-fUWirfyaiEoFgA\';\nvar c=this||self,e=/^[\\w+/_-]+[=]{0,2}$/,f=null,g=function(a){return(a=a.querySelector&&a.querySelector("script[nonce]"))&&(a=a.nonce||a.getAttribute("nonce"))&&e.test(a)?a:""},h=function(a){return a};var l;var n=function(a,b){this.a=b===m?a:""},m={};setTimeout(function(){var a=document;var b="SCRIPT";"application/xhtml+xml"===a.contentType&&(b=b.toLowerCase());b=a.createElement(b);a=u;if(void 0===l){var d=null;var k=c.trustedTypes;if(k&&k.createPolicy){try{d=k.createPolicy("goog#html",{createHTML:h,createScript:h,createScriptURL:h})}catch(p){c.console&&c.console.error(p.message)}l=d}else l=d}a=(d=l)?d.createScriptURL(a):a;a=new n(a,m);b.src=a instanceof n&&a.constructor===n?a.a:"type_error:TrustedResourceUrl";(a=b.ownerDocument&&b.ownerDocument.defaultView)&&\na!=c?a=g(a.document):(null===f&&(f=g(c.document)),a=f);a&&b.setAttribute("nonce",a);google.timers&&google.timers.load&&google.tick&&google.tick("load","xjsls");document.body.appendChild(b)},0);})();(function(){window.google.xjsu=\'/xjs/_/js/k\\x3dxjs.hp.en.U435xAUT4m0.O/m\\x3dsb_he,d/am\\x3dADxBHA/d\\x3d1/rs\\x3dACT90oHghdanrNYJ9NN-fUWirfyaiEoFgA\';})();function _DumpException(e){throw e;}\nfunction _F_installCss(c){}\n(function(){google.jl={dw:false,em:[],emw:false,lls:\'default\',pdt:0,snet:true,uwp:true};})();(function(){var pmc=\'{\\x22d\\x22:{},\\x22sb_he\\x22:{\\x22agen\\x22:true,\\x22cgen\\x22:true,\\x22client\\x22:\\x22heirloom-hp\\x22,\\x22dh\\x22:true,\\x22dhqt\\x22:true,\\x22ds\\x22:\\x22\\x22,\\x22ffql\\x22:\\x22fr\\x22,\\x22fl\\x22:true,\\x22host\\x22:\\x22google.com\\x22,\\x22isbh\\x22:28,\\x22jsonp\\x22:true,\\x22lm\\x22:true,\\x22msgs\\x22:{\\x22cibl\\x22:\\x22Effacer la recherche\\x22,\\x22dym\\x22:\\x22Essayez avec cette orthographe :\\x22,\\x22lcky\\x22:\\x22J\\\\u0026#39;ai de la chance\\x22,\\x22lml\\x22:\\x22En savoir plus\\x22,\\x22oskt\\x22:\\x22Outils de saisie\\x22,\\x22psrc\\x22:\\x22Cette suggestion a bien été supprimée de votre \\\\u003Ca href\\x3d\\\\\\x22/history\\\\\\x22\\\\u003Ehistorique Web\\\\u003C/a\\\\u003E.\\x22,\\x22psrl\\x22:\\x22Supprimer\\x22,\\x22sbit\\x22:\\x22Recherche par image\\x22,\\x22srch\\x22:\\x22Recherche Google\\x22},\\x22nrft\\x22:false,\\x22ovr\\x22:{},\\x22pq\\x22:\\x22\\x22,\\x22refpd\\x22:true,\\x22rfs\\x22:[],\\x22sbas\\x22:\\x220 3px 8px 0 rgba(0,0,0,0.2),0 0 0 1px rgba(0,0,0,0.08)\\x22,\\x22sbpl\\x22:16,\\x22sbpr\\x22:16,\\x22scd\\x22:10,\\x22stok\\x22:\\x22da93hBTbhWCC3tv6Ec6Y1mlLBwY\\x22,\\x22uhde\\x22:false}}\';google.pmc=JSON.parse(pmc);})();</script> </body></html>'
>>>
Citer : Posté le 29/10/2020 08:28 | #
C'est c'est pour HTTP/S Pedrobzh. Nous on fait de l'IRC over TLS, donc c'est complètement différent. Pour faire simple, on a besoin de recoder requests.
Et TLS c'est bidon. Même en faisant une PKI complète à la main (ce que personne ne fais hort milieu pro) on s'en sort pour quelques lignes de config…
Après oui, ça demande de savoir comment ça fonctionne dans les grandes lignes, c'est sûr que si curl ne connait pas ta CA il va râler
Citer : Posté le 29/10/2020 09:15 | #
Du coup, pour essayer de faire un peu avancer tout ça, les grands problèmes vont être :
- La création d'une liaison entre le code et IRC
- L'échange de message avec un timing au poil de cul pour identifier et authentifier GLaDOS auprès d'IRC
- L'envoi et la réception de message (sur un channel)
Citer : Posté le 29/10/2020 09:32 | #
Ça s'appelle faire de l'asynchrone, c'est pas spécialement difficile. Et y'aura une couche d'évènementiel aussi pour éviter de se faire chier.
De toute façon je pense faire une sorte d'intégration à Flask :
@app.route("/post"):
send_message(request.data)
# Répondre à un message IRC
@irc.route("!help")
send_message(help_string)
Citer : Posté le 29/10/2020 10:21 | #
Ok, mais ça c'est plutôt pour communiquer avec les autres utilisateurs sur IRC. Comment se passe concrètement le processus de connexion…
Citer : Posté le 29/10/2020 10:24 | #
Avec un event handler ? 🤔
J'ai pas encore mis les mains dans le cambouis, mais ça me parait pas trop compliqué. À l'occas' tu pourra partager ce que tu as fait pour te connecter manuellement à l'IRC ? Avec openssl s_client entre autres. Ça me fera gagner du temps pour l'implémentation
Citer : Posté le 29/10/2020 10:28 | #
Pour l'instant je n'ai rien de fonctionnel justement
Sinon via le terminal c'est la méthode que tu m'avais linké
user Shadow * * :Shadow
nick Shadow
PING :ABCD123
pong :ABCD123
auth Shadow:mon_motdepasse_du_turfu0000
Citer : Posté le 29/10/2020 10:32 | #
J'ai énormément de mal à croire que quelque chose n'existe pas déjà pour un protocole aussi répandu qu'IRC. Je sais qu'on a beaucoup tendance à être en mode « tentons de refaire ça », mais ici ce n'est pas requis : avec quelques recherches on trouve Limnoria, botnet, sopel, ou des libs comme irc qui se base sur l'asyncio de Python 3.x. Et encore, je ne cite là que des projets qui ont une documentation…
Mon blog ⋅ Mes autres projets
Citer : Posté le 29/10/2020 10:46 | #
je sais mais j'ai la solution!
Spoiler : Tu n'as pas la solution. x3
Sinon +1 pour Cake, de ce que j'ai vu passer sur dev je crois que les libs ont déjà été inspectées, mais ça sonne tellement plus pertinent que je veux bien une explication un minimum détaillée de pourquoi ça marcherait pas.
Citer : Posté le 29/10/2020 10:54 | #
Les libs déjà existantes cumulent plusieurs problèmes :
- Le noyau a parfois été fait dans les années 90 et depuis c'est du rafistolage à grand renfort de code dans les sens et le rendu me semble pas optimisé.
- La doc est plus forcément à jour pour les libs qui ont été maintenues.
- Aucune lib n'est a priori complète (gestion des certificats SSL et authentification SASL)
- Les libs sont complexes à gérer avec des objets à la con dans tous les sens, ce qui rend la documentation insuffisante parce qu'il n'y a pas d'exemples.
- Le protocole IRC ne demande pas une lib qui fait 10 fois le poids du code du bot pour fonctionner, on doit pouvoir faire un truc robuste, intelligent et souple.
Rien que pour le fun ça mérite d'être fouillé, et avoir notre propre lib nous permettra d'avoir les pleins contrôles sur le bot : si on a un problème ou un bug sur une lib qui n'est pas à nous ça va plus être galère à gérer…
Citer : Posté le 29/10/2020 19:23 | #
Bon, j'ai un peu regardé les frameworks de bots que Cake a linké.
Sopel, Limnoria
Ce sont des bots standalone. Ie qui répondent aux messages IRC mais ne sont pas fait pour être déclenchés par des events externes. Pour Sopel, on se fout de tous les plugins qu'il implémente par défaut, à l'exception peut-être de ce qu'il y a dans ADMINCHANNEL. Pour Limnoria j'ai pas regardé mais ça a l'air d'être pareil.
On peut le réutiliser, c'est dans les dépôts d'Arch community, mais on fout à la benne 90% du truc. Et aucune vision sur la facilité avec laquelle on peut créer un plugin qui permette de faire du push v5 → IRC.
D'un point de vue général ce sont des outils clés en main pour des communautés IRC. Pas du tout adapté à notre contexte.
botnet
La manière dont est conçue botnet est peut-être un poil plus adaptée, mais on reste quand même très lié au fonctionnement décrit ci-dessus.
Reste donc les libs. Pour ça on a irc qui ne connait pas du tout SASL. Enfin si, mais à la main. Les autres libs sont généralement en Python 2, sans documentation, sans support de ce qu'on veut (TLS + SASL), dès fois un mix de ces trois points.
Bref. IRC c'est simple. C'est juste de l'évènementiel à la con et on doit pouvoir réimplémenter une stack basique qui copie le fonctionnement des routes Flask pour que dalle de complexité.
Si je résume les besoins, ils sont simples :
– se connecter en TLS + (pseudo) SASL → Shadow l'a fait en 5 secondes à la main
– joindre des channels
– sur event externe, poster des messages dans les channels
– sur event des channels, traiter et répondre aux messages arrivant
Je suis bien le premier à qui ça fait chier qu'il y ait pas une lib qui fasse le taf, mais bon…
Ajouté le 29/10/2020 à 22:43 :
Ah oui, et pourquoi ça me fait chier d'utiliser une lib comme irc :
$ chmod u+x irccat2-aio.py
$ ./irccat2-aio.py --password MyP@ssw0rd -p 6697 irc.planet-casio.com Darks general
ERROR:asyncio:Exception in callback _SelectorSocketTransport._call_connection_lost(ConnectionRes...eset by peer'))
handle: <Handle _SelectorSocketTransport._call_connection_lost(ConnectionRes...eset by peer'))>
Traceback (most recent call last):
File "/usr/lib/python3.8/asyncio/events.py", line 81, in _run
self._context.run(self._callback, *self._args)
File "/usr/lib/python3.8/asyncio/selector_events.py", line 970, in _call_connection_lost
super()._call_connection_lost(exc)
File "/usr/lib/python3.8/asyncio/selector_events.py", line 728, in _call_connection_lost
self._protocol.connection_lost(exc)
File "/usr/lib/python3.8/site-packages/irc/client_aio.py", line 82, in connection_lost
self.connection.disconnect()
File "/usr/lib/python3.8/site-packages/irc/client_aio.py", line 214, in disconnect
self._handle_event(Event("disconnect", self.server, "", [message]))
File "/usr/lib/python3.8/site-packages/irc/client.py", line 376, in _handle_event
self.reactor._handle_event(self, event)
File "/usr/lib/python3.8/site-packages/irc/client.py", line 922, in _handle_event
result = handler.callback(connection, event)
File "/usr/lib/python3.8/site-packages/irc/client.py", line 1159, in _dispatcher
method(connection, event)
File "irccat2-aio.py", line 35, in on_disconnect
self.future.cancel()
AttributeError: 'AioIRCCat' object has no attribute 'future'
Les bibliothèques qui ont 5 ans d'âge et qui sont plus maintenues à part pour fixer des typo, ça me gonfle.
Citer : Posté le 29/10/2020 23:01 | #
OK, rien à dire sur pourquoi les bibliothèques que j'ai linkées ne sont pas cités.
Merci de ce travail de recherche approfondi ! Déjà ça dégage quelques pistes sur ce que tu aimes et n'aimes pas dans ces bibliothèques, j'espère que ça a au moins enrichi ta réflexion sur le sujet.
Est-ce que par hasard au détour de rapports de bugs ou articles sur le sujet tu as éventuellement trouvé d'autres bibliothèques plutôt que de se lancer directement sur coder la nôtre ? Ou est-ce que ça t'a saoûlé et tu es parti en mode « partons pour recoder la nôtre, de toute façon c'est comme ça que ça va se finir » ?
Mon blog ⋅ Mes autres projets
Citer : Posté le 29/10/2020 23:18 | #
Je dois t'avouer que j'ai que dalle cherché. J'avais fait quelques tests y'a un ou deux mois sur python-irc, mais en refaisant le test je sais pourquoi ça m'avait gonflé
Si tu as la motivation d'écumer le web ou les dépôts Git à la recherche de la perle rare, je dis pas non. La principale difficulté étant de trouver un truc qui permet de traiter deux sockets (IRC et v5) en même temps.
Pour info, à base de python-socket uniquement, ça peut finir sur un truc de ce genre.
Donc ça me parait raisonnable en termes de complexité. Surtout que si je fais un wrapper par dessus, y'aura plus qu'à s'occuper du fonctionnel.
Y'a quand même des idées à prendre au niveau de l'API cible, par exemple de ce coté.
Citer : Posté le 29/10/2020 23:20 | #
J'achète l'analyse des libs, pas de souci de mon côté pour le faire à la main, l'analyse montre bien que jusqu'à un niveau assez élevé de souffrance ça restera l'option la plus appropriée.
Citer : Posté le 29/10/2020 23:44 | #
Perso en lib essayées j'ai tenté :
- irc
- irc3
- ircllib
- ircbot
irc DS l'a fait. irc3 est une version un peu plus moderne qu'irc, la SASL est connue, mais la documentation est trop faible (en plus la lib implique des manipulations un peu exotique à coup de fichier de configuration)
Pour irclib et ircbot sont deux libs qui sont en python 2…
Citer : Posté le 30/10/2020 17:29 | #
Bon, j'ai commencé à faire des tests, et c'est plus tricky que prévu, même en utilisant des trucs censés être clés en main. La suite du message est en mode canard en plastique, vous pouvez réagir si je dis une connerie ou si vous voyez une solution plus pertinente.
Pour la communication GLaDOS ↔ v5, je pensais partir sur un socket zeromq : https://zeromq.org/languages/python/
C'est une sorte de wrapper sur les sockets de base, ce qui permet d'éviter de réinventer la roue en termes de buffering, etc. Comme dit Breizh, c’est en gros juste du texte mais qui gère l’enveloppe tout seul.
Me voilà donc à créer un socket directement dans la v5. Je fais donc un socket de type PAIR (un seul client, communication bidirectionnelle), initialisé par la v5. Ce socket est attribut d'une classe IRCPipe, qui est initialisée sous le petit de glados dans app/__init__.py. Ce qui me permet d'accéder dans la théorie au socket en faisant juste un from app import glados puis glados.post("X a posté dans Y").
Mais en fait non, vu que quand on fait ça, c'est un worker indépendant qui va être appelé, donc essayer de créer un nouveau socket. Problème, y'en a déjà un qui écoute, donc erreur Address already in use. Normal.
Ce qui exclu donc les sockets mono-pairs, et le fait que ce soit la v5 qui instancie socket serveur. Ce qui donnerai le cas d'usage suivant :
GLaDOS.py est lancé → création d'un socket serveur → la v5 a un évent à envoyer → la v5 essaie de créer un socket client → envoi du message → fermeture du socket client.
Par contre ça rend la communication GLaDOS → v5 plus difficile
Questions subsidiaires :
– Y'a t'il des cas de figure où on souhaite que GLaDOS push des évents sur la v5 ?
– Si oui, lesquels ?
– Est-ce que ça vaut pas le coup de passer par une API HTTP à ce moment là (parfaitement gérée par Flask pour le coup) ?
Note : je viens de tomber sur flask_zmq. Si ce machin marche, c'est sûrement que je m'y prends mal pour créer mon socket, en particulier dans la partie init_app…
Citer : Posté le 30/10/2020 17:41 | #
Merci pour tout le boulot ici. Personnellement, je pense que la communication GLaDOS → v5 n'a pas vraiment lieu d'être. On ne s'en sert que pour kick/ban... et ça n'a pas vraiment de raison d'être dans la shoutbox. Une interface permettant de proprement gérer les bans seraient appropriée, et ça passera pas dans le contexte de l'IRC. Donc pour moi, push de la shout vers la v5 c'est inutile.
Du reste, je peux me tromper ici, mais tu peux pas juste créer un socket partagé dans le filesystem et envoyer tout le monde dessus ? Modulo évidemment un mutex type flock(2) selon ce qui est disponible en Python.
FInalement, si c'est trop casse-pieds, surtout ne t'emmerde pas et crée une API clé-en-mains type HTTP sur ton bot et on n'en parle plus.
Citer : Posté le 30/10/2020 17:44 | #
J’suis d’accord sur le fait que les kicks/bans de la v5 ont pas trop lieu d’être partagés entre IRC et site (ou alors du site vers l’IRC seulement, à la limite)… et faut tester la suppression de compte d’ailleurs.