Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.18 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4.  
  5. our $RELAY_OFFENSIVE_RE = '(fags?|faggots?|niggers?|cunts?|homos?|trannys?|trannies?)';
  6. our $RELAY_PERSONAL_RE = '(skrenta|blekko|(thomas|tom) markson)';
  7.  
  8. our $point = 0;
  9. our %players = {'dealer' => [10000000000,0,0]};
  10. our $bet = 0;
  11. sub do_craps {
  12. my ( $conn ) = @_;
  13. $players{$conn->{user}} = [1000,0,0];
  14. tmp_no_rotty( $conn );
  15.  
  16. my $n = craps_nusers();
  17. $n++;
  18.  
  19. my $footer_first = [];
  20.  
  21. if ( $n == 1 ) {
  22. push @$footer_first, "There is $n user at this craps table.";
  23. } else {
  24. push @$footer_first, "There are $n users at this craps table.";
  25. }
  26.  
  27. my $footer = [];
  28. push @$footer, '[' . join( ' ', @$footer_first ) . ']';
  29.  
  30. my $udata = $conn->{udata};
  31.  
  32. push @$footer, '[Type /help to list all commands, /quit to quit]';
  33.  
  34. println( join( "\n", @$footer ) );
  35.  
  36. $conn->{in_craps} = 1;
  37. $conn->{interrupt_sub} = \& craps_finish;
  38.  
  39. my $last_craps = $conn->{udata}->{last_craps};
  40.  
  41. if ( defined $last_craps ) {
  42. craps_announce( '%' . "$conn->{user} entered (" . delta_time( $last_craps, 1 ) . ")", undef, $conn->{user} );
  43. } else {
  44. craps_announce( '%' . "$conn->{user} entered", undef, $conn->{user} );
  45. }
  46.  
  47. $conn->{udata}->{last_craps} = time;
  48. return \& craps_loop;
  49. }
  50.  
  51. sub do_craps_cli {
  52. my ( $conn ) = @_;
  53.  
  54. my $user = $conn->{user};
  55. my $msg = $conn->{arg};
  56.  
  57. if ( $conn->{options} ) {
  58. my @options = keys %{ $conn->{options} };
  59. my $option = shift @options;
  60. $option .= ' ' . $msg if $msg ne '';
  61. return craps_command( $conn, $option );
  62. }
  63. return;
  64. }
  65.  
  66. sub craps_loop {
  67. my ( $conn ) = @_;
  68.  
  69. delete $conn->{grep};
  70.  
  71. $conn->{interrupt_sub} = \& craps_finish;
  72.  
  73. $conn->{readline_no_cr} = 1;
  74. $conn->{readline_no_empty_return} = 1;
  75.  
  76. my $line = th_readline( '>' );
  77.  
  78. return sub {
  79. my $msg = $$line;
  80.  
  81. $msg = clean_string2($msg);
  82.  
  83. $conn->{interrupt_sub} = \& craps_finish;
  84. delete $conn->{relay_systat};
  85.  
  86. if ( $msg =~ m,^/(.*)$, ) {
  87. return craps_command( $conn, "$1" );
  88. } elsif ( $msg =~ m,^(\?)$, ) {
  89. return craps_command( $conn, "$1" );
  90. } else {
  91. # TODO remove the "/" requirement for commands since there is no chat
  92.  
  93. my $user = $conn->{user};
  94.  
  95. if ( $msg ne '' && ! is_robot($conn) ) {
  96. $user = uc $user if $conn->{tty};
  97. craps_announce( "dealer: /? for help", undef, $conn->{user} );
  98. $conn->{udata}->{last_craps} = time;
  99. }
  100. }
  101. return \& craps_loop;
  102. }
  103. }
  104.  
  105. sub craps_command {
  106. my ( $conn, $cmd ) = @_;
  107.  
  108. my $arg;
  109. my $arg2;
  110.  
  111. if ( ! $conn->{bg_relay} ) {
  112. $conn->{interrupt_sub} = \& craps_finish;
  113. }
  114.  
  115. if ( $cmd =~ /^([^\s]+)\s+(.+)$/ ) {
  116. $cmd = $1;
  117. $arg = $2;
  118. }
  119. my $rest = $arg;
  120.  
  121. if ( $arg =~ /^([^\s]+)\s+(.+)$/ ) {
  122. $arg = $1;
  123. $arg2 = $2;
  124. }
  125.  
  126. $arg =~ s/\s+$//;
  127. $arg2 =~ s/\s+$//;
  128.  
  129. $cmd =~ s/\s$//;
  130. my $orig_cmd = $cmd;
  131. $cmd = lc $cmd;
  132.  
  133. $conn->{arg} = $arg;
  134. $conn->{arg2} = $arg2;
  135.  
  136. if ( $cmd =~ m,^(quit|exit|bye)$,i ) {
  137. if ( defined $conn->{spoof_fd} ) {
  138. craps_finish( $TH::conns->{ $conn->{spoof_fd} }, 0 );
  139. return \& craps_loop;
  140. } else {
  141. println() if ! $conn->{bg_relay};
  142. craps_finish($conn);
  143. return;
  144. }
  145. }
  146.  
  147. if ( $cmd eq 'help' || $cmd eq '?' ) {
  148. println() if ! $conn->{bg_relay};
  149.  
  150. my @rhelp =
  151. (
  152. "/clear clear screen",
  153. "/help print this message",
  154. "/afk away from keyboard",
  155. "/quit exit relay",
  156. "/roll roll dice",
  157. "/bet <#> place a passline bet, default and minimum is 5, increments must be of 5",
  158. "/add add odds to your passline bet",
  159. "/reduce reduce your odds",
  160. "/rail show what you have on the rail",
  161. "/table show what you have on the table",
  162. "/s relax and take a sip",
  163. "/y take a big stretch and yawn",
  164. "/w systat",
  165. "/who who's playing craps",
  166. );
  167.  
  168. $conn->{func_next} = \& craps_loop;
  169. return pager( \@rhelp );
  170. }
  171.  
  172. if ( $cmd eq 'w' || $cmd eq 'systat' || $cmd eq 'finger' ) {
  173. println() if ! $conn->{bg_relay};
  174. delete $conn->{relay_systat};
  175. $conn->{func_next} = \& craps_loop;
  176. return \& do_finger;
  177. }
  178.  
  179. if ( $cmd eq 'who' ) {
  180. println() if ! $conn->{bg_relay};
  181. $conn->{func_next} = \& craps_loop;
  182. $conn->{relay_systat} = 1;
  183. return \& do_finger;
  184. }
  185.  
  186. if ( $cmd eq 'clear' || $cmd eq 'cls' ) {
  187. #println() if ! $conn->{bg_relay};
  188.  
  189. $conn->{func_next} = \& craps_loop;
  190. return \& do_clear;
  191. }
  192.  
  193. if ( $cmd eq 'bet'){
  194. $bet = 5;
  195. if ($rest){
  196. $bet = int($rest);
  197. if ($bet == 0){
  198. $bet = 5;
  199. }
  200. }
  201. $players{$conn->{user}}[1] = $bet;
  202. $players{$conn->{user}}[0] -= $bet;
  203. craps_announce("$conn->{user} bets: $bet", undef, $conn->{user});
  204. return \& craps_loop;
  205. }
  206.  
  207. if ( $cmd eq 'add'){
  208. $bet = $players{$conn->{user}}[1] * 3;
  209. $players{$conn->{user}}[0] -= $bet;
  210. $players{$conn->{user}}[2] = $bet;
  211. craps_announce("$conn->{user} places odds of $players{$conn->{user}}[2]", undef, $conn->{user});
  212. return \& craps_loop;
  213. }
  214.  
  215. if ( $cmd eq 'rail'){
  216. craps_announce("$conn->{user}: $players{$conn->{user}}[0]");
  217. return \& craps_loop;
  218. }
  219.  
  220. if ( $cmd eq 'table'){
  221. craps_announce("$conn->{user}: $players{$conn->{user}}[1] to place", undef, $conn->{user});
  222. craps_announce("$conn->{user}: $players{$conn->{user}}[2] odds", undef, $conn->{user});
  223. return \& craps_loop;
  224. }
  225.  
  226. if ( $cmd eq 'roll' || $cmd eq 'dice' || $cmd eq 'r' ) {
  227. #println() if ! $conn->{bg_relay};
  228. if ( $players{$conn->{user}}[1] == 0 ) {
  229. craps_announce("dealer: Please place a passline bet before you roll", undef, $conn->{user});
  230. return \& craps_loop;
  231. }
  232. $conn->{func_next} = \& craps_loop;
  233. my $die1 = randint( 1, 6 );
  234. my $die2 = randint( 1, 6 );
  235. my $roll = $die1 + $die2;
  236. my $rollmsg = "";
  237. if ($roll == 2){
  238. $rollmsg = "two craps, two";
  239. if ($point == 0){
  240. crap_out();
  241. }
  242. } elsif ($roll == 3){
  243. $rollmsg = "three craps, three";
  244. if ($point == 0){
  245. crap_out();
  246. }
  247. } elsif ($roll == 4){
  248. $rollmsg = "four";
  249. if ($point == 0){
  250. $point = 4;
  251. } elsif ($point == 4){
  252. $rollmsg = "four, winner four";
  253. payout();
  254. }
  255. } elsif ($roll == 5){
  256. $rollmsg = "five";
  257. if ($point == 0){
  258. $point = 5;
  259. } elsif ($point == 5){
  260. $rollmsg = "five, winner five";
  261. payout();
  262. }
  263. } elsif ($roll ==6){
  264. $rollmsg = "six";
  265. if ($point == 0){
  266. $point = 6;
  267. } elsif ($point == 6){
  268. $rollmsg = "six, winner six";
  269. payout();
  270. }
  271. } elsif ($roll == 7){
  272. $rollmsg = "seven";
  273. if ($point == 0){
  274. $rollmsg = "seven, winner seven";
  275. payout();
  276. } else {
  277. $rollmsg = "seven out, line away";
  278. crap_out();
  279. }
  280. } elsif ($roll == 8){
  281. $rollmsg = "eight";
  282. if ($point == 0){
  283. $point = 8;
  284. } elsif ($point == 8){
  285. $rollmsg = "eight, winner eight";
  286. payout();
  287. }
  288. } elsif ($roll == 9){
  289. $rollmsg = "nine";
  290. if ($point == 0){
  291. $point = 9;
  292. } elsif ($point == 9){
  293. $rollmsg = "nine, winner nine";
  294. payout();
  295. }
  296. } elsif ($roll == 10){
  297. $rollmsg = "ten";
  298. if ($point == 0){
  299. $point = 10;
  300. } elsif ($point == 10){
  301. $rollmsg = "ten, winner ten";
  302. payout();
  303. }
  304. } elsif ($roll == 11){
  305. $rollmsg = "eleven";
  306. if ($point == 0){
  307. $rollmsg = "eleven, winner eleven";
  308. payout();
  309. } else {
  310. $rollmsg = "eleven, yo eleven";
  311. }
  312. } else {
  313. $rollmsg = "twelve";
  314. if ($point == 0){
  315. $rollmsg = "twelve, craps twelve";
  316. crap_out();
  317. } else {
  318. $rollmsg = "boxcars";
  319. }
  320. }
  321.  
  322. craps_announce( "%$conn->{user} rolled: $die1 $die2 -> $rollmsg -> point is $point", undef, $conn->{user} );
  323.  
  324. return \& craps_loop;
  325. }
  326.  
  327. if ( $cmd eq 'me' ) {
  328. if ( $rest ne '' ) {
  329. my $user = $conn->{user};
  330. $user = uc $user if $orig_cmd eq 'ME';
  331.  
  332. if ( $rest eq 'poots' || $rest eq 'POOTS' ){
  333. }
  334. elsif ( $rest =~ /^doot/i ){
  335. craps_announce( '* ' . $user . ' ' . $rest, undef, $conn->{user} );
  336. }
  337. elsif ( $rest =~ /^tood/i ){
  338. craps_announce( '* ' . $user . ' ' . $rest, undef, $conn->{user} );
  339. } else {
  340. craps_announce( '* ' . $user . ' ' . $rest, undef, $conn->{user} );
  341. }
  342. } else {
  343. println() if ! $conn->{bg_relay};
  344. }
  345. return \& craps_loop;
  346. }
  347.  
  348. if ( $cmd eq 's' ) {
  349. $rest = " $rest" if $rest ne '';
  350. my $user = $conn->{user};
  351. my $sips = 'sips';
  352. $user = uc $user if $orig_cmd eq 'S';
  353. $sips = uc $sips if $orig_cmd eq 'S';
  354. craps_announce( "* $user $sips" . $rest, undef, $conn->{user} );
  355. return \& craps_loop;
  356. }
  357.  
  358. if ( $cmd eq 'y' ) {
  359. my $yawn = 'yawns';
  360. my $user = $conn->{user};
  361. $rest = " $rest" if $rest ne '';
  362. $user = uc $user if $orig_cmd eq 'Y';
  363. $yawn = uc $yawn if $orig_cmd eq 'Y';
  364. craps_announce( "* $user $yawn" . $rest, undef, $conn->{user} );
  365. return \& craps_loop;
  366. }
  367.  
  368. if ( $cmd eq 'afk' ) {
  369. $rest = " $rest" if $rest ne '';
  370. craps_announce( '* ' . $conn->{user} . ' is AFK' . $rest, undef, $conn->{user} );
  371. return \& craps_loop;
  372. }
  373.  
  374. if ( $cmd eq 'mes' ) {
  375. if ( $rest ne '' ) {
  376. my $user = $conn->{user};
  377. $user = uc $user if $orig_cmd eq 'MES';
  378. if ( $conn->{user} =~ /s$/ ) {
  379. craps_announce( '* ' . $user . "' " . $rest, undef, $conn->{user} );
  380. } else {
  381. craps_announce( '* ' . $user . "'s " . $rest, undef, $conn->{user} );
  382. }
  383. }
  384. return \& craps_loop;
  385. }
  386.  
  387. println() if ! $conn->{bg_relay} && ! defined $conn->{spoof_fd};
  388. error( 'unrecognized craps command - type /help for a list' );
  389. return \& craps_loop;
  390. }
  391.  
  392. sub crap_out{
  393. my $k;
  394. my $v;
  395. while (($k,$v) = each %players){
  396. $players{$k}[1] = 0;
  397. $players{$k}[2] = 0;
  398. }
  399. $point = 0;
  400. return \& craps_loop;
  401. }
  402.  
  403. sub payout{
  404. my $k;
  405. my $v;
  406. while (($k,$v) = each %players){
  407. $players{$k}[0] += ( $players{$k}[1] * 2 );
  408. $players{$k}[0] += ( $players{$k}[2] * 3 );
  409. $players{$k}[1] = 0;
  410. $players{$k}[2] = 0;
  411. }
  412. $point = 0;
  413. return \& craps_loop;
  414. }
  415. sub craps_finish {
  416. my ( $conn, $noannounce ) = @_;
  417.  
  418. delete $conn->{interrupt_sub};
  419. delete $conn->{in_craps};
  420. delete $conn->{bg_relay};
  421. delete $conn->{relay_systat};
  422. clear_readline($conn);
  423.  
  424. if ( ! defined $noannounce ) {
  425. #$noannounce = 1 if ( time - $conn->{last} > 3600 ); # don't notify of exit if > 1h idle
  426. my ( $n_other_logins, $oldest ) = n_user_relay_logins( $conn->{user}, $conn->{fd} );
  427. $oldest = time - $oldest;
  428. $noannounce = 1 if ( $n_other_logins > 0 && $oldest < 3600 );
  429. #$noannounce = 1 if $conn->{autouser};
  430. }
  431.  
  432. if ( ! $noannounce ) {
  433. craps_announce( '%' . "$conn->{user} exited", undef, $conn->{user} );
  434. } else {
  435. }
  436. }
  437.  
  438. sub n_user_relay_logins
  439. {
  440. my ( $user, $skip ) = @_;
  441.  
  442. my $count;
  443. my $last;
  444.  
  445. foreach my $port ( keys %{ $TH::conns } ) {
  446. my $c = $TH::conns->{$port};
  447. next if ! $c->{in_craps};
  448. next if $port == $skip;
  449. next if $c->{user} ne $user;
  450. $count++;
  451. $last = $c->{last} if !defined $last || $c->{last} < $last;
  452. }
  453.  
  454. return ( $count, $last ) if wantarray;
  455. return $count;
  456. }
  457.  
  458. our %relay_last_message;
  459. our %relay_duplicate_count;
  460.  
  461. our %relay_last_interval;
  462. our %relay_interval_count;
  463.  
  464. sub craps_announce {
  465. my ( $msg, $skip, $user ) = @_;
  466.  
  467. # suppress backgrounded relay messages from rotty
  468. my $rotty_tmp = $TH::rotty_users;
  469. $TH::rotty_users = undef;
  470.  
  471. my $conn = get_conn();
  472.  
  473. if ( $relay_last_message{ $user } ne $msg || $msg =~ /^%/ ) {
  474. delete $relay_duplicate_count{ $user };
  475. $relay_last_message{ $user } = $msg;
  476. }
  477. $relay_duplicate_count{ $user }++;
  478.  
  479. my $interval = int( time / 10 );
  480.  
  481. if ( defined $relay_last_interval{ $user } && $relay_last_interval{ $user } != $interval ) {
  482. delete $relay_interval_count{ $user };
  483. }
  484.  
  485. $relay_last_interval{ $user } = $interval;
  486. $relay_interval_count{ $user }++;
  487. my $relay_ban = "";
  488. if ( $relay_ban ) {
  489. println() if ! $conn->{bg_relay};
  490. error( "you have been silenced for " . delta_time( time - ( $TH::data->{banned}->{$user}->{t} - time ) ) );
  491. } elsif ( $relay_duplicate_count{ $user } > 10 || $relay_interval_count{ $user } > 100 ) {
  492. relay_suppress( $conn, $msg );
  493. } elsif ( $msg =~ /\b$RELAY_OFFENSIVE_RE\b/i ) {
  494. relay_suppress( $conn, $msg );
  495. } elsif ( $msg =~ /\b$RELAY_PERSONAL_RE\b/i ) {
  496. relay_suppress( $conn, $msg, 1 );
  497. } else {
  498. print $::relaylog $msg."\n";
  499.  
  500. foreach my $port ( keys %{ $TH::conns } ) {
  501. next if $port < 1;
  502. next if defined $skip && $port == $skip;
  503.  
  504. my $c = $TH::conns->{$port};
  505. next if ! $c->{in_craps};
  506. next if defined $c->{do_relay_log};
  507. next if defined $user && $c->{udata}->{relay_ignore}->{$user};
  508. next if is_robot($c); # robots don't get to listen
  509.  
  510. my $ruser = $c->{user};
  511. my $bell;
  512.  
  513. if ( $ruser ne '' && $ruser ne $conn->{user} ) {
  514. my @nicknames;
  515.  
  516. if ( defined $c->{udata}->{nicknames} ) {
  517. @nicknames = @{ $c->{udata}->{nicknames} };
  518. }
  519.  
  520. foreach my $nickname ( $c->{user}, @nicknames ) {
  521. if ( $msg =~ / .*\b\Q$nickname\E\b/i ) {
  522. $bell = "\007";
  523. }
  524. }
  525. }
  526. # Output an extra CRLF for Teletypes to avoid stacking output
  527. if ( $port != $TH::cur_fd && $TH::conns->{$port}->{tty} ){
  528. output( $port, "\r\n", 1 );
  529. }
  530. output( $port, scr_line_clear($TH::conns->{$port}) . $bell . ' ' . $msg. "\n", 1 );
  531. readline_repaint( $TH::conns->{$port} );
  532.  
  533. }
  534. }
  535. $TH::rotty_users = $rotty_tmp;
  536. }
  537.  
  538. sub craps_nusers {
  539. my ( $msg ) = @_;
  540. my $sum = 0;
  541. foreach my $port ( keys %{ $TH::conns } ) {
  542. next if $port !~ /^\d+$/;
  543. next if $port == 0;
  544. my $c = $TH::conns->{$port};
  545. next if ! $c->{in_craps} && ! $c->{bg_relay};
  546. $sum++;
  547. }
  548. return $sum;
  549. }
  550. 1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement