IRC gateway

Revision as of 17:34, 20 November 2019 by PureFox (talk | contribs) (Added Go)

Create an IRC Gateway capable of connecting an IRC server with another IRC server or Chat server

IRC gateway is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

Go

Library: go-ircevent


Just a bare-bones gateway. <lang go>package main

import (

   "crypto/tls"
   "fmt"
   "github.com/thoj/go-ircevent"
   "log"
   "os"

)

func main() {

   if len(os.Args) != 9 {
       fmt.Println("To use this gateway, you need to pass 8 command line arguments, namely:")
       fmt.Println("  <server1> <channel1> <nick1> <user1> <server2> <channel2> <nick2> <user2>")
       return
   }
   server1, channel1, nick1, user1 := os.Args[1], os.Args[2], os.Args[3], os.Args[4]
   server2, channel2, nick2, user2 := os.Args[5], os.Args[6], os.Args[7], os.Args[8]
   irc1 := irc.IRC(nick1, user1)
   irc1.VerboseCallbackHandler = true
   irc1.Debug = false
   irc1.UseTLS = true
   irc1.TLSConfig = &tls.Config{InsecureSkipVerify: true}
   irc2 := irc.IRC(nick2, user2)
   irc2.VerboseCallbackHandler = true
   irc2.Debug = false
   irc2.UseTLS = true
   irc2.TLSConfig = &tls.Config{InsecureSkipVerify: true}
   irc1.AddCallback("001", func(e *irc.Event) {
       irc1.Join(channel1)
       msg := fmt.Sprintf("<gateway> Hello %s. Please send your first message to %s.", nick1, nick2)
       irc1.Privmsg(nick1, msg)
       log.Println(msg)
   })
   irc1.AddCallback("366", func(e *irc.Event) {})
   irc1.AddCallback("PRIVMSG", func(e *irc.Event) {
       msg := fmt.Sprintf("<%s> %s", nick1, e.Message)
       irc2.Privmsg(nick2, msg)
       log.Println(msg)
   })
   irc2.AddCallback("001", func(e *irc.Event) {
       irc2.Join(channel2)
       msg := fmt.Sprintf("<gateway> Hello %s. Please wait for your first message from %s.", nick2, nick1)
       irc2.Privmsg(nick2, msg)
       log.Println(msg)
   })
   irc2.AddCallback("366", func(e *irc.Event) {})
   irc2.AddCallback("PRIVMSG", func(e *irc.Event) {
       msg := fmt.Sprintf("<%s> %s", nick2, e.Message)
       irc1.Privmsg(nick1, msg)
       log.Println(msg)
   })
   err1 := irc1.Connect(server1)
   if err1 != nil {
       log.Fatal(err1)
   }
   err2 := irc2.Connect(server2)
   if err2 != nil {
       log.Fatal(err2)
   }
   go irc2.Loop()
   irc1.Loop()

}</lang>

Tcl

This code is called as a complete script, perhaps like this: <lang sh>./ircgateway.tcl irc://hostA.org/fishing bait irc://hostB.com:6667/haxors botfly</lang>

Library: Tcllib (Package: picoirc)

<lang tcl>#!/bin/env tclsh8.5 package require picoirc

      1. Parse script arguments
  1. URL form: irc://foobar.org/secret

if {$argc != 4} {

   puts stderr "wrong # args: should be \"$argv0 ircA nickA ircB nickB\""
   exit 1

} lassign $argv url1 nick1 url2 nick2

      1. How to do the forwarding from one side to the other

proc handle {from to -> state args} {

   upvar #0 conn($from) f conn($to) t chan($to) chan
   switch -exact -- $state {

"chat" { lassign $args target nick message type if {![string match "*>>*<<*" $message]} { picoirc::post $t $chan ">>$nick said<< $message" } } "traffic" { lassign $args action channel nick newnick switch -exact -- $action { "entered" - "left" { picoirc::post $t $chan ">>$nick has $action<<" } } } "close" { exit }

   }

}

      1. Connect and run the event loop

set chan(1) [lindex [picoirc::splituri $url1] 2] set chan(2) [lindex [picoirc::splituri $url1] 2] interp alias {} handle1to2 {} handle 1 2 interp alias {} handle2to1 {} handle 2 1 set conn(1) [picoirc::connect handle1to2 $nick1 $url1] set conn(2) [picoirc::connect handle2to1 $nick2 $url2] vwait forever</lang>