Telegramme zu IRC / Slack

Hallo,
ich hatte mir heute überlegt ob es irgendwie möglich wäre
Infos/Nachrichten aus IPS zu einem IRC Server oder Slack-Chat
zu übertragen. Hat da vielleicht jemand eine Idee ?

MFG Matze

Hi Matze!

Gibt da so ein paar Sachen bei Google:
Php Irc Client - Tutorials - Infos - Anleitungen - Dreamcodes
Test IRC client bot in PHP · GitHub
GitHub - spoulson/Chatmore: Simplified web-based IRC client for PHP/Unix
php ‚2‘ IRC :: web-based chat :: webchat via web

ABER … PHP Scripte laufen bei IPS normal nur 30 Sekunden. Du könntest also nur dich mit dem IRC Server verbinden, eine Nachricht absetzen und die Verbindung wieder trennen. Eine dauerhafte Verbindung über z.B. mehrere Minuten/Stunden ist so nicht direkt möglich.

Grüße,
Chris

okay , danke für die Antwort, war auch nur so eine Idee

Du brauchst dafür einen Datenprovider. Also ein externes tool, dass quasi just-in-time mit dem IRC kommuniziert und dann nur die relevanten Daten von und zu IPS durchleitet. Im IPS-Chatroom, der auch auf dem IRC basiert, gabs zwei Bots, die ne kopplung an IPS hatten. Einer, der IPS_Attain, ist noch online. Isis, mein Bot, hab ich eingemottet weil mir für die Weiterentwicklung der KI auf Alice-basis (ein bekannter Chatbot) die Zeit fehlte.

Es geht also. Frage ist wie viel Zeit zu da reinstecken willst.

Toni

Hi,

ja ich habe einen IPS basierenden IRC Bot auf freenode.net am laufen.

Client Socket anlegen
Adresse irc.freenode.net
Port 6667

Daran eine Registervariable
Daran das folgende Script:

Das Script wird halt über eingehende IRC Messages jedesmal getriggert.
Wichtig ist das man auf PING abfragen reagiert, sonst wird man als inaktiv rausgeschmissen.

<?
##### Konfig ######
$debug = false;
$SemaphoreNameString = "IRC";
$ID = 22786 /*[Client Socket IRC]*/; // ID des Client Socket
$nickname = 'Nickname of the Bot';
$server_chan = '#irgendeinchannel';

if ($_IPS['SENDER'] == 'RegisterVariable')
{
   $array = preg_split('/ /', $_IPS['VALUE'], 4);
   //foreach ($array as $key => $value) IPS_LogMessage(IPS_GetName($_IPS['SELF']),".$key.".trim($value)."..");
	IPS_SetScriptTimer($_IPS['SELF'],400); // Watchdog
   if (IPS_SemaphoreEnter($SemaphoreNameString,9000))
   {
		if ($array[1] == "PRIVMSG")
		{
		   $nick = GetTextBetween($array[0], ":", "!");
			$chan = $array[2];
			$msg  = trim(substr($array[3],1));
			if ($debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']),"Nachricht im Chan: $chan ist: $msg");
		   //If we have any msg at the server
	   	if ($chan == $server_chan){
		      // IF we have a msg on channel
				$msgarray = explode(" ",$msg);
				if ($debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']),$msgarray[0]." ");
				//Hier werden je nach eingehender Message über unterprogramme Antwoten gesendet....
				If (strtolower($msgarray[0]) == "!version")  SendCommand ("PRIVMSG " . $chan . " :Ich habe IPS Version ##" . GetValue(54123 /*[IPS Version\UpdateIdLocal]*/));
				If (strtolower($msgarray[0]) == "!info")  // if anybody type in !info at the channel, do this or that
				// usw.....
		   }

		   if ($chan == $nickname){
	      // IF we have a privatmsg
	   		$msgarray = explode(" ",$msg);
				if ($debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']),$msgarray[0]." ");
				//Hier werden je nach eingehender Message über unterprogramme Antworten gesendet....
				If (strtolower($msgarray[0]) == "!info")  // if anybody type in !info at the private chat, do this or that
		   }


		switch ($array[1])
		{
		   case "JOIN":
				// if anybody joins the channel, do this or that
				SendCommand ("NAMES $chan :"); // Userlist herrausfinden
				break;

			case "PART":
			case "QUIT":
		   	// if anybody left the channel, do this or that
		   	SendCommand ("NAMES $server_chan :"); // Userlist herrausfinden
				break;

			case "NICK":
			   // if anybody changes the nick name, do this or that
				break;

			case "353": //userlist
			   $array = preg_split('/ /', $_IPS['VALUE'], 6);
			   $chan = $array[4];
				// response after the NAMES command, do this or that
				break;
		}

		if ($array[0] == 'PING'){
   		// IRC Sends a "PING" command to the client which must be anwsered with a "PONG"
			// Or the client gets Disconnected
	   	SendCommand("PONG ".trim($array[1]));
   		if ($debug) IPS_LogMessage(IPS_GetName($_IPS['SELF']),"..PONG..");
		}

	   if (FindString($_IPS['VALUE'], '*** Found your hostname')){
		//if(trim($array[0]) == ":NickServ!NickServ@services."){
		   //If we have joined the server
  			SendCommand("JOIN $server_chan"); //Join the chanel
		}

		if (FindString($_IPS['VALUE'], 'Looking up your hostname')){
			//Ok, we have connected to the server, now we have to send the login commands.
	     	SendCommand("PASS NOPASS"); //Sends the password not needed for most servers
 		   SendCommand("NICK $nickname"); //sends the nickname
  	   	SendCommand("USER $nickname USING IPSymcon IRC"); //sends the user must have 4 paramters
		// SendCommand("/umode +i
\r");
		}
		IPS_SemaphoreLeave($SemaphoreNameString);
	}
}


if ($_IPS['SENDER'] == 'WebFront')
{
   SendCommand ("PRIVMSG $server_chan :".$_IPS['VALUE']);
   SetValue($_IPS['VARIABLE'],"");
}

if ($_IPS['SENDER'] == 'TimerEvent')
{ //connect to the server lost -> reconnect
	IPS_ApplyChanges($ID);
	IPS_LogMessage(IPS_GetName($_IPS['SELF']),"Timer abgelaufen ->reconnect");
	// ATN_SetValueEreignisListe(34832 /*[.Alarm/Meldungsliste\Meldungen]*/,"IRC","keine Rückmeldung vom Chat. Socket wird neu verbunden.");

}

if ($_IPS['SENDER'] == 'Execute')
{
	SendCommand ("NAMES $server_chan :");
}

function SendCommand ($cmd)
{
	 global $ID;
    CSCK_SendText($ID,$cmd ."
");
}

function FindString($string, $findme)
{
	$pos = stripos($string, $findme);
	return ($pos !== false);
}
function GetTextBetween($string, $start, $end){
    preg_match_all( "/$start(.*)$end/U", $string, $match );
    return $match[1][0];
}
?>

Ich habe das laufende Script gekürzt und hoffe das es trotzdem läuft.