TeleIRC: Bridge Telegram-IRC
Maintainer: Stefanauss
TeleIRC è il software che fa da bridge (ponte) tra il canale IRC ufficiale Ninux (#ninux.org @ freenode) e il gruppo ufficiale telegram (https://t.me/ninuxorg), consentendo a chi entra in uno dei due sistemi di chat di comunicare con chi è membro dell'altro. In questo modo ognuno può usare il proprio sistema di chat preferito
Configurazione
Bot Telegram
L'interazione programmatica con il servizio di messaggistica istantanea Telegram avviene attraverso dei "bot", dei software che creano un profilo telegram con cui è poi possibile chattare, sia singolarmente che in chat di gruppo, impartendo loro comandi, mettendoli in attesa di particolari eventi o messaggi che scateneranno le azioni desiderate. In due parole: sono "utenti" telegram programmabili.
Per creare un bot, si chatta con un super-bot chiamato @botfather. Per aprire una chat con botfather basta cercarlo nel campo ricerca globale del proprio client telegram. Ecco come si svolge la chat di creazione di un bot TeleIRC: se qualcosa non tornasse, basta semplicemente seguire le istruzioni passo-passo che il bot ci sputerà contro dopo ogni nostra parola. Tra parentesi quadre commenti a margine da leggere, ma non digitare.
Noi:: /newbot
botfather: Alright, a new bot. How are we going to call it? Please choose a name for your bot.
Noi:: Ninux.org TeleIRC Bridge [il "nome e cognome" del nostro bot, sarebbe il nome per esteso che comparirà nelle bolle-messaggio]
botfather: Good. Now let's choose a username for your bot. It must end in bot. Like this, for example: ~TetrisBot or tetris_bot.
Noi:: ninuxorg_teleircbot [questo sarà un "nickname" per il bot, che si potrà menzionare con la @nomecheabbiamoappenascritto. Deve terminare in "bot"]
botfather: Done! Congratulations on your new bot. You will find it at t.me/ninuxorg_teleircbot. ... Use this token to access the HTTP API: numeriacaso:altrarobaacaso ...
Noi:: /setprivacy [dobbiamo permettere al bot di accedere a tutti i messaggi postati dal nostro gruppo]
botfather: Choose a bot to change group messages settings.
Noi:: @ninuxorg_teleircbot [digitiamo o selezioniamo il nick del nostro bot, specificato al passo precedente]
botfather: ... Current status is: ENABLED
Noi:: Disable [occhio a digitarlo esattamente così]
botfather: Success! The new status is: DISABLED. /help
Noi:: /setabouttext
botfather: Choose a bot to change the about section.
Noi:: @ninuxorg_teleircbot [digitiamo o selezioniamo il nick del nostro bot, specificato al passo precedente]
botfather: OK. Send me the new 'About' text. People will see this text on the bot's profile page and it will be sent together with a link to your bot when they share it with someone.
Noi:: [massimo 120 caratteri per descrivere il nostro bot, che compariranno nel suo profilo]
botfather: Success! About section updated. /help
Noi:: /setdescription
botfather: Choose a bot to change description.
Noi:: @ninuxorg_teleircbot [digitiamo o selezioniamo il nick del nostro bot, specificato al passo precedente]
botfather: OK. Send me the new description for the bot. People will see this description when they open a chat with your bot, in a block titled 'What can this bot do?'.
Noi:: [una descrizione più lunga di cosa farà il nostro bot, che comparirà a chiunque cominci una chat col nostro bot]
botfather: Success! Description updated. /help
Noi: /setuserpic
botfather: Choose a bot to change profile photo.
Noi:: @ninuxorg_teleircbot [digitiamo o selezioniamo il nick del nostro bot, specificato al passo precedente]
botfather: OK. Send me the new profile photo for the bot.
Noi: [carichiamo la foto profilo che vogliamo per il nostro bot]
Quello che abbiamo fatto in sintesi è:
- creare un nuovo bot, con nome esteso e nickname di nostra scelta
abbiamo ottenuto un token (numeriacaso:altrarobaacaso) con cui accedere ai server telegram. Appuntiamoceli!
- gli abbiamo permesso di leggere tutti i messaggi del gruppo Telegram in cui si troverà, che è essenziale affinché possa ritrasmetterli
- lo abbiamo dotato di una descrizione breve, una estesa e di una sua foto profilo
A questo punto non ci resta che aggiungere il nostro bot nei gruppi telegram per il quali dovrà fare da bridge.
TeleIRC
Installazione
Base: Ubuntu Server 16.04.x LTS
N.B.: Questo howto non copre la parte di installazione, configurazione e messa in sicurezza del sistema operativo server, macchina virtuale o container che ospiterà il servizio, ma solo le istruzioni specifiche per TeleIRC.
TeleIRC è basato sul runtime javascript Node.js. Per installare una versione aggiornata di Node.js utilizzeremo i repository NodeSource (disponibili per molteplici distribuzioni Linux).
curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - sudo apt-get install -y nodejs
Prima di proseguire con l'installazione di TeleIRC, installiamo librerie e toolchain necessarie:
sudo apt-get install build-essentials libicu-dev
Installiamo TeleIRC attraverso il gestore pacchetti di Node.js
sudo npm install -g teleirc
Una volta completata l'installazione, generiamo la configurazione di partenza di teleirc, che risiederà in ~/.teleirc/config.js e che poi personalizzeremo:
mkdir ~/.teleirc teleirc --genconfig
config.js
Apriamo il file appena generato col nostro editor di testo per terminale preferito e cominciamo ad editarlo nei punti chiave. Segue la versione appuntata in italiano del file, che rappresenta anche la configurazione in essere per l'istanza in uso da Ninux:
var config = {}; module.exports = config; ///////////////////// // General config // ///////////////////// // livello di dettaglio dei log, dal più dettagliato al meno // silly, debug, verbose, info, warn, error config.logLevel = 'info'; // NINUX: copioincollare il token fornito da botfather config.tgToken = 'numeriacaso:robaacaso'; // NINUX: i cambi topic IRC vengono annunciati su Telegram config.sendTopic = true; // NINUX: ingressi e uscite dal canale non vengono annunciati su telegram // NINUX: sennò usciamo pazzi config.sendNonMsg = false; // NINUX: il nostro bridge salva foto, file, messaggi vocali e qualsiasi media Telegram // NINUX: e li rende disponibili su IRC inviando un link config.showMedia = true; // NINUX: la URL conterrà 8 caratteri a caso per evitare che sia facilmente predicibile config.mediaRandomLength = 8; // NINUX: Se il bot si disconnette e poi riconnette, alla sua riconnessione NON inoltrerà // NINUX: i messaggi telegram più vecchi di tot secondi, configurabili qui // NINUX: un valore molto alto rischia di inondare il canale con tantissimi messaggi // NINUX: se il bot rimane disconnesso per molto tempo // NINUX: per il momento lasciamo 1 minuto, calibreremo col tempo config.maxMsgAge = 60; // Porta HTTP per servire i media cachati config.httpPort = 9090; // NINUX: La URL dei media sarà http://teleirc.ninux.org:9090/8numeriacaso/file.ext config.httpLocation = 'http://teleirc.ninux.org' + ':' + config.httpPort; // NINUX: usando /command davanti al proprio messaggio telegram // NINUX: il bot eviterà di anteporre il nostro nick telegram // NINUX: quando pubblicherà il messaggio su IRC // NINUX: è potenzialmente utile per inoltrare comandi IRC puri // NINUX: al momento disabilitata perché non funziona bene col meetbot config.allowCommands = false; ////////////////// // IRC config // ////////////////// // NINUX: il bot colorerà i nick degli utenti telegram // NINUX: li rende facilmente distinguibili agli utenti IRC // NINUX: attivata perché ovvia bene alla mancanza degli utenti telegram // NINUX: nella lista degli utenti IRC config.nickcolor = true; // Nick color palette config.palette = [ 'white', 'silver', 'navy', 'green', 'red', 'brown', 'purple', 'olive', 'yellow', 'lime', 'teal', 'cyan', 'pink', 'blue' ]; // If soloUse is true, send all messages without username preview, intented // to use telegram as a limited IRC client. config.soloUse = false; // NINUX: I prossimi due parametri decidono come compaiono gli utenti telegram su IRC // NINUX: la prima scelta è il nick, se specificato dall'utente // NINUX: se l'utente non ha un nick, usiamo nome-cognome config.nameFormat = '%username%'; config.usernameFallbackFormat = '%firstName% %lastName%'; // NINUX: i ritorni a capo nei messaggi Telegram vengono sostituiti da 3 puntini sospensivi // NINUX: prima di venire reinoltrati su IRC // Volendo si può utilizzare \n per specificare di mantenere i ritorni a capo config.replaceNewlines = ' … '; config.ircNick = 'ninux-telegram'; config.ircServer = 'irc.freenode.net'; // array of commands to send to IRC server as soon as we're connected, // example: config.ircPerformCmds = [ // 'PRIVMSG Q@CServe.quakenet.org :AUTH <username> <password>' // ] config.ircPerformCmds = []; config.channels = [ // example of a barebones IRC channel: // '#channel1' will be bridged to a Telegram group called 'Tg_Group_1' { ircChan: '#teleircnnx', tgGroup: 'TeleIRC Testing' //}, // example of a password-protected IRC channel: //{ // ircChan: '#channel2', // chanPwd: 'passwd', // tgGroup: 'Tg_Group_2' //}, // example of an IRC channel with an alias: // channel name will be displayed as '!channel3' instead of '!XXXXXchannel3' //{ // ircChan: '!XXXXXchannel3', // chanAlias: '!channel3', // tgGroup: 'Tg_Group_3' } ]; // see https://node-irc.readthedocs.org/en/latest/API.html#client for // documentation config.ircOptions = { userName: 'ninux-telegram', realName: 'Ninux.org TeleIRC Bot', port: 7070, localAddress: null, showErrors: false, autoRejoin: true, autoConnect: true, channels: [], // auto generated, do not touch secure: true, selfSigned: true, certExpired: false, floodProtection: true, floodProtectionDelay: 1000, sasl: false, stripColors: true, channelPrefixes: '&#!', messageSplit: 512, encoding: '' }; // if you wish to relay every irc message to telegram, set this to true. // if false, then only lines matching config.hlRegexp will be relayed config.ircRelayAll = true; // the default hilight regexp will match lines containing the bot nick, or // lines starting with '! ' var regex = '^ *(?:' + config.ircNick + '[:,]?|!) +(.*\\S.*)$'; config.hlRegexp = new RegExp(regex, 'i'); // if there was a match, should we only show the parenthesized substring match? // with the default regexp this would hide the bot nickname in messages when // highlighted config.hlOnlyShowMatch = false;