Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use IO::Socket::INET;
- use Storable qw(thaw nfreeze);
- use Data::Dumper;
- use DBI;
- use DBD::mysql;
- use Digest::MD5 (md5_hex);
- use threads;
- # use Proc::Daemon;
- # Proc::Daemon::Init;
- system("color 5F");
- # system("echo -e '\e[0m'");
- print q{
- ____ ___ _____ _ _ _____ __ __ _ _
- ( ___)/ __)( _ )( \( )( _ )( \/ )( \/ )
- )__)( (__ )(_)( ) ( )(_)( ) ( \ /
- (____)\___)(_____)(_)\_)(_____)(_/\/\_) (__) by Revok};
- # auto-flush on socket
- $| = 1;
- # creating a listening socket
- my $socket = new IO::Socket::INET (
- LocalHost => 'localhost',
- LocalPort => '7778',
- Proto => 'tcp',
- Listen => 5,
- # Reuse => 1
- );
- die "cannot create socket $!\n" unless $socket;
- print "\n\nServer waiting for client connection on port 7777\n";
- my %db = (
- 'driver' => 'mysql',
- 'host' => '208.110.82.108',
- # 'host' => 'ps.revok.com.br',
- 'user' => 'economy',
- 'password' => 'KabiFE3EXE6o2OvuYiPa66HePI64Ya',
- 'port' => 3306,
- 'database' => 'economy2'
- );
- # my $conn = DBI->connect(
- # 'dbi:'.$db{'driver'}.':'.$db{'database'}.':'.$db{'host'}.':'.$db{'port'},
- # $db{'user'},
- # $db{'password'},
- # {mysql_enable_utf8 => 1,
- # mysql_auto_reconnect => 1,
- # mysql_connect_timeout => 20
- # }
- # ) or die (DBI->errstr);
- # Establishing a connection with the DB
- my @sof_queue = ();
- # my $server = 'Asgard';
- my $old_reg_delete = time - 1;
- my $old_reg_delete_priority = time - 1;
- # print "Wait a new \n";
- # waiting for a new client connection
- while(my $client_socket = $socket->accept()) {
- async(\&handle_con, $client_socket)->detach;
- }
- sub handle_con {
- my $conn = DBI->connect(
- 'dbi:'.$db{'driver'}.':'.$db{'database'}.':'.$db{'host'}.':'.$db{'port'},
- $db{'user'},
- $db{'password'},
- {mysql_enable_utf8 => 1,
- mysql_auto_reconnect => 1
- # , mysql_connect_timeout =>
- }
- ) or die (DBI->errstr);
- my $client_socket = shift;
- # get information about a newly connected client
- my $client_address = $client_socket->peerhost();
- my $client_port = $client_socket->peerport();
- print "Unregistered connection from $client_address:$client_port\n";
- my $to_receive;
- my $buffer;
- my $server;
- while (my $data = <$client_socket>) {
- if (!$to_receive) {
- $buffer = undef;
- ($to_receive) = $data =~ /^(\d+).*/;
- $to_receive++;
- $data =~ s/^(\d+)//;
- }
- $to_receive -= length($data);
- $buffer .= $data;
- if (!$to_receive) {
- chomp $buffer;
- my $real_data = substr($buffer, 3);
- my $command = substr($buffer, 0, 3);
- my $udata = thaw $real_data;
- if ($command eq 'ADD') {
- next if (!$udata->{items});
- my $store_md5 = md5_hex(nfreeze $udata->{items});
- next if ($udata->{vender_id} == 4611374);
- my $oldmd5;
- # my $query = "SELECT md5 FROM vendors WHERE server = ? AND vendor_id = ? LIMIT 1;";
- # my $stmt = $conn->prepare($query);
- # $stmt->execute($udata->{vender_id}, $server);
- # $stmt->bind_columns(\$oldmd5);
- # $stmt->fetch();
- # print "MD5: [ $oldmd5 -> $store_md5 ]\n";
- #my $query = "INSERT INTO vendors (vendor_id, vendor_name, shop_title, location_map, location_x, location_y, server) VALUES (?,?,?,?,?,?,?);";
- $query = "INSERT INTO vendors (vendor_id, vendor_name, shop_title, location_map, location_x, location_y, md5, server, time) VALUES (?,?,?,?,?,?,?,?, now()) ON DUPLICATE KEY UPDATE vendor_name = ?, shop_title = ?, location_map = ?, location_x = ?, location_y = ?, md5 = ?, time = now(), online = 1;";
- $stmt = $conn->prepare($query);
- $stmt->execute($udata->{vender_id}, $udata->{vender_name}, $udata->{title}, $udata->{location}->{map}, $udata->{location}->{x}, $udata->{location}->{y}, $store_md5, $server,
- $udata->{vender_name}, $udata->{title}, $udata->{location}->{map}, $udata->{location}->{x}, $udata->{location}->{y}, $store_md5);
- if ($stmt->errstr) {
- next;
- }
- #if ($oldmd5 != $store_md5) {
- print "[$server] UPDATING ".$udata->{vender_name}."'s shop \n";
- my $query1 = "DELETE FROM items WHERE owner_id = ? AND server = ?;";
- my $stmt1 = $conn->prepare($query1);
- $stmt1->execute($udata->{vender_id}, $server);
- if ($stmt->errstr) {
- next;
- }
- foreach my $item (@{$udata->{items}}) {
- my $query = "INSERT INTO items (item_id, owner_id, name, price, amount, server) VALUES (?,?,?,?,?,?);";
- my $stmt = $conn->prepare($query);
- $stmt->execute($item->{nameID}, $udata->{vender_id}, $item->{full_name}, $item->{price}, $item->{amount}, $server);
- }
- #}
- } elsif ($command eq 'SOF') {
- print "[$server] QUEUEING SOF\n";
- push (@sof_queue, { min_x => $udata->{x} - 14, max_x => $udata->{x} + 14, min_y => $udata->{y} - 14, max_y => $udata->{y} + 14, map_name => $udata->{map}, server => $server, time => time });
- #print Data::Dumper::Dumper(@sof_queue);
- } elsif ($command eq 'IDD') {
- $server = $udata->{server};
- print sprintf("[$server] Registering user %s to server %s\n", $udata->{username}, $udata->{server});
- # print "QUEUEING SOF\n";
- # push (@sof_queue, { min_x => $udata->{x} - 14, max_x => $udata->{x} + 14, min_y => $udata->{y} - 14, max_y => $udata->{y} + 14, map_name => $udata->{map}, server => $server, time => time });
- #print Data::Dumper::Dumper(@sof_queue);
- }
- while ($sof_queue[0] && time > ($sof_queue[0]->{time} + 30)) { # prevent autovivification
- print "[$server] TRIGGER ".($sof_queue[0]->{time} + 30)." end ".$sof_queue[0]->{time} ." and ".time."\n";
- print "[$server] UPDATING OFFLINE MERCHS... \n";
- my $query = "UPDATE vendors SET online=0 WHERE online = ? AND location_x >= ? AND location_x <= ? AND location_y >= ? AND location_y <= ? AND location_map = ? AND server = ? AND time < ADDDATE(NOW(), INTERVAL -5 MINUTE);";
- my $stmt = $conn->prepare($query);
- $stmt->execute(1, $sof_queue[0]->{min_x}, $sof_queue[0]->{max_x}, $sof_queue[0]->{min_y}, $sof_queue[0]->{max_y}, $sof_queue[0]->{map_name}, $server);
- unless ($stmt->errstr) {
- shift(@sof_queue);
- }
- }
- }
- }
- $conn->disconnect();
- $socket->close();
- }
Advertisement
Add Comment
Please, Sign In to add comment