tweet.pl 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. # This script responds with a comment each time someone in the channel says "clockbot"
  2. #
  3. # This script requires you to have the text file "clockbot" in your /home/user/.irssi/ directory
  4. #
  5. # cat ~/signatures/sig-natures | sed 's/^%$/####/;'| tr '\n' ' ' | sed 's/[[:space:]]\+/ /g;s/[[:space:]]####[[:space:]]/\n/g;' > ../../clockbot
  6. use Irssi;
  7. use vars qw($VERSION %IRSSI);
  8. use POSIX qw(strftime);
  9. use LWP::UserAgent;
  10. $VERSION = "1.3.0";
  11. %IRSSI = (
  12. author => 'pleia2',
  13. contact => 'lyz@princessleia.com ',
  14. name => 'TC-14 Tweet',
  15. description => 'Protocol Droid, dedicated to Lautre.roots',
  16. license => 'GNU GPL v2 or later',
  17. url => 'http://www.lautre.net/',
  18. );
  19. open ( CLOCKPO, "<.irssi/quotes" ) or die "can't open clockbot:$!\n";
  20. chomp( @clockpo = <CLOCKPO> );
  21. close CLOCKPO;
  22. srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip -f`);
  23. my $last_tweet="";
  24. my $debug=0;
  25. my $bingo=0;
  26. my $last='';
  27. my $warn='';
  28. my @dad=("asr", "asr`", "asr_", "asr\\", "asr`_");
  29. my $timeout=30;
  30. my $warndate=time()-$timeout;
  31. Irssi::settings_add_str($IRSSI{name}, # default fifo_remote_file
  32. 'tc_admin_chans', '#flood #starwars'); #
  33. Irssi::settings_add_str($IRSSI{name}, # default fifo_remote_file
  34. 'tc_admins', 'asr coin plop'); #
  35. Irssi::settings_add_str($IRSSI{name}, # default fifo_remote_file
  36. 'tc_logfile', '/home/tc-14/var/last.log'); #
  37. Irssi::settings_add_str($IRSSI{name}, # default fifo_remote_file
  38. 'tc_changefile', '/home/tc-14/var/changelog'); #
  39. Irssi::settings_add_str($IRSSI{name}, # default fifo_remote_file
  40. 'tc_tailgrep', '/home/tc-14/bin/tailgrep'); #
  41. my @chan=split m/ /, Irssi::settings_get_str("tc_chans");
  42. my @admin_chan=split m/ /, Irssi::settings_get_str("tc_admins");
  43. my $logfile=Irssi::settings_get_str("tc_logfile");
  44. my $changefile=Irssi::settings_get_str("tc_changefile");
  45. my $tailgrep=Irssi::settings_get_str("tc_tailgrep");
  46. sub in_array {
  47. my ($arr,$search_for) = @_;
  48. return grep {$search_for eq $_} @$arr;
  49. }
  50. sub gazouille {
  51. my ( $user, $pass ) = qw ( lautrenet OoD0aiph );
  52. my $message = $_[0];
  53. my $url = 'http://identi.ca/api/statuses/update.xml';
  54. my $ua = LWP::UserAgent->new ();
  55. my $req = HTTP::Request->new ( POST => $url );
  56. $req->headers->authorization_basic( $user, $pass );
  57. $req->content("status=$message");
  58. $req->content_type('application/x-www-form-urlencoded');
  59. my $res = $ua->request ($req);
  60. return $res->is_success;
  61. }
  62. sub event_privmsg {
  63. my ($server, $data, $nick, $mask) =@_;
  64. my ($target, $text) = $data =~ /^(\S*)\s:(.*)/;
  65. #print ( "C:$target X:$text A:$admin D:$warndate L:$last W:$warn N:$nick D:$data" );
  66. @admin_chan=split m/ /, Irssi::settings_get_str("tc_admins");
  67. @chan=split m/ /, Irssi::settings_get_str("tc_chans");
  68. sub send_server($$$$) {
  69. my ($action,$cible,$pseudo,$msg)=@_;
  70. $server->command ( "msg $target SWarn C:$cible X:$action A:$admin D:$warndate L:$last W:$warn N:$pseudo T:$msg" ) unless ($debug == 0);
  71. if (in_array(@chan,$target) || in_array(@admin_chan,$pseudo))
  72. {
  73. return;
  74. } else {
  75. if (($warndate + $timeout) < time()) {
  76. $warn='';
  77. $last='';
  78. }
  79. if (!($warn eq $pseudo)) {
  80. if ($last eq $pseudo) {
  81. $server->command ( "msg $cible $pseudo: Chut.");
  82. $warn=$nick;
  83. } else {
  84. $server->command ( "$action $cible $msg" );
  85. $last=$nick;
  86. }
  87. } else {
  88. $server->command ( "msg $cible $pseudo bloque pour $timeout" ) unless $debug=0;
  89. }
  90. $warndate=time();
  91. }
  92. }
  93. my $admin=0;
  94. if (in_array(@chan,$target) || in_array(@admin_chan,$target))
  95. {
  96. return;
  97. }
  98. foreach $father (@dad) {
  99. if ($father eq $nick) {
  100. $admin=1;
  101. }
  102. }
  103. if ( $text =~ /^!tweet\s*(.*)/) {
  104. $changefile=Irssi::settings_get_str("tc_changefile");
  105. if (in_array(@admin_chan, $target)) { return ; }
  106. if ($1 eq '') { $server->command("msg $target $nick: Usage: !tweet <<message>>"); } #$server->command ( "msg $target $nick: !tweet <<mesage>>" ); }
  107. elsif ($1 eq 'changelog') {
  108. open ( CHANGL, "tail -n1 $changefile |" ) or $server->command ( "msg $target $nick: fichier vide" );
  109. #chomp( @temp = <CHANGL> );
  110. #foreach $line (@temp) {
  111. # $last_tweet=$line;
  112. # if (gazouille ($line)) {
  113. # $clocky = $clockpo[rand @clockpo];
  114. # $server->command("msg $target Gazouilli posté! $clocky") unless ($nick =~ /edgard/i);
  115. # }
  116. # else
  117. # {
  118. # $server->command ("msg $target $nick: Erreur lors du post du message");
  119. # }
  120. #}
  121. close ( CHANGL );
  122. }
  123. elsif ($1 eq 'last') {
  124. $server->command("msg $target $nick: Last tweet was:");
  125. $server->command("msg $target $nick: $last_tweet");
  126. }
  127. elsif (length($1)>139) { $server->command("msg $target $nick: Message trop long, plus de 139 caractères." ); }
  128. else {
  129. # $server->command("msg $target Message: $nick |$1|");
  130. $last_tweet=$1;
  131. if (gazouille ($1)) {
  132. $clocky = $clockpo[rand @clockpo];
  133. $server->command("msg $target Gazouilli posté! $clocky") unless ($nick =~ /edgard/i);
  134. }
  135. else
  136. {
  137. $server->command ("msg $target $nick: Erreur lors du post du message");
  138. }
  139. }
  140. }
  141. elsif ( $text =~ /^!changelog( .+)?/ ) {
  142. if (in_array(@admin_chan,$target))
  143. { return; }
  144. $changefile=Irssi::settings_get_str("tc_changefile");
  145. if ($1 eq '') { $server->command ( "msg $target $nick: !changelog (list|add|last) [-n nb lignes (pour list)] [<serveur> [<liste d'actions>]]" );
  146. } elsif ($1 =~ /^ last( .+)?/) {
  147. open ( CHANGL, "tail -n1 $changefile |" ) or $server->command ( "msg $target $nick: fichier vide" );
  148. chomp( @temp = <CHANGL> );
  149. foreach $line (@temp) {
  150. $server->command ( "msg $target $nick: $line" );
  151. }
  152. close ( CHANGL );
  153. } elsif ($1 =~ /^ list( .+)?/) {
  154. undef @temp;
  155. if ($1 eq '') {
  156. $server->command ( "msg $target $nick: changelog en pv." );
  157. open ( CHANGL, "tail $changefile |" ) or $server->command ( "msg $target $nick: fichier vide" );
  158. } else {
  159. my $pattern = $1;
  160. $pattern =~ s/^ //;
  161. $pattern =~ s/['"\$]/_/g;
  162. $server->command ( "msg $target $nick: changelog pour '$pattern' en pv" );
  163. $tailgrep=Irssi::settings_get_str("tc_tailgrep");
  164. Irssi::print(">> changelog list $pattern");
  165. open ( CHANGL, "$tailgrep $changefile !changelog $pattern |" ) or $server->command ( "msg $target $nick: erreur de pattern ou fichier vide" );
  166. }
  167. chomp( @temp = <CHANGL> );
  168. close CHANGL;
  169. foreach $line (@temp) {
  170. $server->command ( "msg $nick $line" );
  171. }
  172. } elsif ($1 =~ /^ add ([^ ]+) (.+)/) {
  173. my $locdate=strftime "%d/%m/%Y %H:%M", localtime;;
  174. open ( CHANGL, ">> $changefile" ) or $server->command ( "msg $target $nick: erreur de fichier... (O)" );
  175. printf CHANGL "%s", "$locdate : $1 - $nick - $2\n" or $server->command ( "msg $target $nick: erreur de fichier... (W)" );
  176. close CHANGL or $server->command ( "msg $target $nick: erreur de fichier... (C)" );
  177. $clocky = $clockpo[rand @clockpo];
  178. $server->command ( "msg $target $nick: $clocky" );
  179. #send_server("msg", $target, $nick, $clocky) unless ($nick =~ /edgard/i);
  180. } else {
  181. $server->command ( "msg $target $nick: !changelog (list|add|last) [nb lignes (pour list)] [<serveur> [<liste d'actions>]]" );
  182. }
  183. }
  184. elsif ( $text =~ /^!lastlog( .+)?/ ) {
  185. if (in_array(@admin_chan,$target))
  186. { return; }
  187. if ($1 eq '') { $server->command ( "msg $target $nick: !lastlog list [-n NBLignes] [<liste d'actions>]" );
  188. } elsif ($1 =~ /^ list( .+)?/) {
  189. undef @temp;
  190. $logfile=Irssi::settings_get_str("tc_logfile");
  191. Irssi::print(">> $logfile - $pattern");
  192. if ($1 eq '') {
  193. $server->command ( "msg $target $nick: lastlog global en pv." );
  194. open ( CHANGL, "tail $logfile |" ) or $server->command ( "msg $nick fichier vide" );
  195. } else {
  196. my $pattern = $1;
  197. $tailgrep=Irssi::settings_get_str("tc_tailgrep");
  198. $pattern =~ s/^ //;
  199. $pattern =~ s/['"\$]/_/g;
  200. $server->command ( "msg $target $nick: lastlog pour '$pattern' en pv." );
  201. open ( CHANGL, "$tailgrep $logfile !lastlog '$pattern' |" ) or $server->command ( "msg $target $nick: erreur de pattern ou fichier vide" );
  202. }
  203. chomp( @temp = <CHANGL> );
  204. close CHANGL;
  205. foreach $line (@temp) {
  206. $server->command ( "msg $nick $line" );
  207. Irssi::print("-- $line");
  208. }
  209. } else { $server->command ( "msg $target $nick: !lastlog list [-n NBLignes] [<liste d'actions>]" );
  210. }
  211. }
  212. if ($debug == 1) {
  213. $server->command ( "msg $target D1 A:$admin L:$last W:$warn N:$nick B:$bingo" );
  214. my $locdate=time()-$warndate;
  215. $server->command ( "msg $target D2 W:$warndate T1:".time." T2:$locdate" );
  216. }
  217. }
  218. Irssi::signal_add('event privmsg', 'event_privmsg');
  219. Irssi::signal_add("message public", "event_privmsg");
  220. print $IRSSI{"name"}." loaded $VERSION.";