Perl Omegle/IRC Bridge Bot

Tue. June 22, 2010
Categories: Perl
Tags: ,
#!/usr/bin/perl
# Written by Andrew Brown
# Free to be redistributed, edited, and reused in any way
# http://www.drusepth.net
 
use strict;
use JSON;
use IO::Socket;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
 
$| = 1; # Autoflush off
 
# Omegle madness
my $omegle_id;
my $omegle_connected = -1;
my $omegle_haspartner = 0;
my $omegle_events;
 
# IRC madness
my $irc_sock;
my $irc_id = 1;
my %irc_settings = (
	'network'   => 'irc.tddirc.net',
	'port'      => 6667,
	'nickname'  => 'OmegleStranger',
	'channel'   => '#geeknook'
);
 
# Auxillary madness
my $ua = LWP::UserAgent->new;
 
# FIGHT!
$irc_sock = new IO::Socket::INET "$irc_settings{'network'}:$irc_settings{'port'}"
	or die "Cannot connect to $irc_settings{'network'} on port $irc_settings{'port'}: $!n";
 
irc_send("USER", "$irc_settings{'nickname'} "x3 . ":$irc_settings{'nickname'}");
irc_send("NICK", $irc_settings{'nickname'});
 
while (my $text = <$irc_sock>)
{
	chomp $text;
	#print $text;
 
	my ($host, $username, $said) = (irc_get_host($text), irc_get_username($text), irc_get_said($text));
	my @incoming = split(/ /, $text);
 
	if ($incoming[1] and ($incoming[1] eq "376" or $incoming[1] eq "422"))
	{
		irc_send("JOIN", $irc_settings{'channel'});
	}
 
	if ($incoming[1] eq "433")
	{
		$irc_id++;
 
		irc_send("USER", "$irc_settings{'nickname'} "x3 . ":$irc_settings{'nickname'}");
		irc_send("NICK", $irc_settings{'nickname'});
	}
 
	if ($incoming[1] eq "366")
	{
		sleep 5;
 
		omegle_start();
	}
 
	if ($omegle_connected == 0)
	{
		sleep 10;
 
		omegle_start();
	}
 
	if ($incoming[0] eq "PING")
	{
		irc_send("PONG", $incoming[1]);
	}
 
	$omegle_events = omegle_poll_event_list();
	omegle_handle_events();
 
	if ($incoming[1] eq "PRIVMSG" and $incoming[3] eq "!next")
	{
		print "Getting a new Stranger.n";
		omegle_start();
	}
 
	if ($incoming[1] eq "PRIVMSG" and $incoming[2] eq $irc_settings{'channel'})
	{
		print " [$said]n";
		omegle_send(irc_get_username() . " says: " . irc_get_said());
	}
}
 
sub irc_send
{
 
   my $p = join (' ', @_);
   print $irc_sock $p . "rn";
 
}
 
sub irc_get_username
{
   return substr($_[0], 1, index($_[0], "!") - 1);
}
 
sub irc_get_host
{
   return substr($_[0], index($_[0], "!") + 1, index($_[0], " ") - index($_[0], "!") - 1);
}
 
sub irc_get_said
{
   my $offset = length(irc_get_username($_[0])) +
		length(irc_get_host($_[0])) +
		length("PRIVMSG") +
		length($irc_settings{'channel'}) + 6;
 
   if (length($_[0]) >= $offset) {
      my $said = substr($_[0], $offset);
      $said = substr($said, 0, length($said) - 1);
      return $said;
   } else {
      return "";
   }
}
 
sub omegle_start
{
	my $request;
	my $id;
 
	$request = POST "http://omegle.com/start";
	$id = $ua->request($request)->decoded_content;
	$id = substr($id, 1, 6);
 
	$omegle_id = $id;
 
	print "Chatting on Omegle with ID $omegle_id.n";
	$omegle_connected = 1;
}
 
sub omegle_stop
{
	my $request;
	my $id;
 
	$request = POST "http://omegle.com/disconnect";
	$omegle_connected = 0;
}
 
sub omegle_poll_event_list
{
	my $request;
	my $event_list_string;
	my $event_list;
 
	$request = POST "http://omegle.com/events", [ id => $omegle_id ];
	$event_list_string = $ua->request($request)->decoded_content;
	print $event_list_string . "n";
 
	if ($event_list_string ne "null")
	{
		$event_list = from_json($event_list_string);
		#$event_list = $event_list_string;
	} else {
		$event_list = [];
	}
 
	return $event_list;
}
 
sub omegle_toggle_typing
{
	my $request;
 
	$request = POST "http://omegle.com/typing", [ id => $omegle_id ];
	$ua->request($request)->decoded_content;
 
}
 
sub omegle_send
{
	my $request;
	my $message;
 
	($message) = @_;
 
	$request = POST "http://omegle.com/send", [ msg => $message, id => $omegle_id ];
	$ua->request($request)->decoded_content;
}
 
sub omegle_disconnect
{
	my $request;
 
	$request = POST "http://omegle.com/disconnect", [ id => $omegle_id ];
	$ua->request($request)->decoded_content;
 
	$omegle_id = "";
}
 
sub omegle_handle_events
{
	foreach my $event (@{$omegle_events})
	{
		my $event_type = @{$event}[0];
		print "Event type: $event_typen";
 
		if ($event_type eq "waiting")
		{
			print "Waiting for a stranger...n";
		}
 
		if ($event_type eq "connected")
		{
			$omegle_haspartner = 1;
 
			print "Found a stranger!n";
 
			irc_send("PRIVMSG", $irc_settings{'channel'}, ":Found a new stranger!");
			#irc_send("PRIVMSG", "drusepth", ":Found a new stranger!");
 
			omegle_send("Hello stranger! Instead of just one stranger, you've been connected to an IRC "
				. "chat room of tons of strangers! They see everything you say and you see everything "
				. "they say. Have fun!");
		}
 
		if ($event_type eq "gotMessage" )
		{
			my $temp_message;
			$temp_message = @{$event}[1];
 
			if ($temp_message eq "Please reload the page for technical reasons.")
			{
				omegle_stop();
				omegle_start();
			}
 
			print " $temp_messagen";
 
			#irc_send("PRIVMSG", $irc_settings{'channel'}, ": $temp_message");
			irc_send("PRIVMSG", $irc_settings{'channel'}, ":$temp_message");
		}
 
		if ($event_type eq "strangerDisconnected")
		{
			$omegle_connected = 0;
			$omegle_haspartner = 0;
			$omegle_id = "";
 
			print "Stranger has disconnected!n";
 
			#irc_send("PRIVMSG", $irc_settings{'channel'}, ":This stranger has disconnected. :(");
			#irc_send("PRIVMSG", "drusepth", ":Stranger disconnected!");
		}
	}
}

>

  • Kane York

    i’m getting errors about the use of $text. Where’s the socket storing to $text?

    • http://www.drusepth.net Andrew Brown

      Oops, WordPress was eating my tags. In the while loop, $text = . The code’s been fixed, above.