Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » GLaDOS V5
Shadow15510 Hors ligne Administrateur Points: 4981 Défis: 16 Message

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 :
-



1, 2 Suivante
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

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 !!!
pensés suicidaires
   90%
Kbd2 Hors ligne Membre Points: 268 Défis: 0 Message

Citer : Posté le 29/10/2020 08:13 | #


Almost like HTTP is easy because it's not secure...
Pedrobzh Hors ligne Membre Points: 616 Défis: 0 Message

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:
Python 3.8.6 (default, Sep 25 2020, 09:36:53)
[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> &raquo;</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%">&nbsp;</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&amp;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&amp;prev=https://www.google.fr/&amp;sig=K_1rH_GjFdhBjjJNebhdIegnUzC3s%3D">Google.fr</a></div></div><p style="font-size:8pt;color:#767676">&copy; 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>'
>>>

pensés suicidaires
   90%
Dark storm Hors ligne Labélisateur Points: 11538 Défis: 176 Message

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
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Shadow15510 Hors ligne Administrateur Points: 4981 Défis: 16 Message

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)
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Dark storm Hors ligne Labélisateur Points: 11538 Défis: 176 Message

Citer : Posté le 29/10/2020 09:32 | #


L'échange de message avec un timing au poil de cul pour identifier et authentifier GLaDOS auprès d'IRC

Ç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 :
# Envoyer un message suite à une requête API HTTP
@app.route("/post"):
    send_message(request.data)

# Répondre à un message IRC
@irc.route("!help")
   send_message(help_string)

Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Shadow15510 Hors ligne Administrateur Points: 4981 Défis: 16 Message

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…
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Dark storm Hors ligne Labélisateur Points: 11538 Défis: 176 Message

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
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Shadow15510 Hors ligne Administrateur Points: 4981 Défis: 16 Message

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é
$ openssl s_client -connect irc.planet-casio:6697
user Shadow * * :Shadow
nick Shadow
PING :ABCD123
pong :ABCD123
auth Shadow:mon_motdepasse_du_turfu0000

"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Cakeisalie5 Hors ligne Membre de CreativeCalc Points: 1853 Défis: 10 Message

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…

Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !
Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Lephenixnoir Hors ligne Administrateur Points: 20809 Défis: 143 Message

Citer : Posté le 29/10/2020 10:46 | #


Pedrobzh a écrit :
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.
Shadow15510 Hors ligne Administrateur Points: 4981 Défis: 16 Message

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…
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Dark storm Hors ligne Labélisateur Points: 11538 Défis: 176 Message

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 :
$ wget https://raw.githubusercontent.com/jaraco/irc/master/scripts/irccat2-aio.py

$ 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.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Cakeisalie5 Hors ligne Membre de CreativeCalc Points: 1853 Défis: 10 Message

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 » ?

Promotion ordinaire sur les inscriptions sur Planète Casio : en ce moment, c'est gratuit !
Mon blogBesoin d'utilitaires de transfert vers et depuis la calculatrice sous GNU/Linux ?
Dark storm Hors ligne Labélisateur Points: 11538 Défis: 176 Message

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é.
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir Hors ligne Administrateur Points: 20809 Défis: 143 Message

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.
Shadow15510 Hors ligne Administrateur Points: 4981 Défis: 16 Message

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…
"Ce n'est pas parce que les chose sont dures que nous ne les faisons pas, c'est parce que nous ne les faisons pas qu'elles sont dures." Sénèque

Dark storm Hors ligne Labélisateur Points: 11538 Défis: 176 Message

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
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Lephenixnoir Hors ligne Administrateur Points: 20809 Défis: 143 Message

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.
Breizh_craft Hors ligne Modérateur Points: 1103 Défis: 7 Message

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.
Breizh.pm – Un adminsys qui aime les galettes.
1, 2 Suivante

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 35 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd