1use strict;
2use vars qw($VERSION %IRSSI);
3use Irssi;
4use Irssi::Irc;
5use DBI;
6
7$VERSION = '1.02';
8%IRSSI = (
9   authors      => 'John Engelbrecht',
10   contact      => 'jengelbr@yahoo.com',
11   name         => 'twsocials.pl',
12   description  => 'IRC version of Social Commands',
13   license      => 'Public Domain',
14   changed      => 'Sat Nov 20 18:25:12 CST 2004',
15   url          => 'http://irssi.darktalker.net/',
16);
17
18my $instrut =
19  ".------------------------------------------------------.\n".
20  "| 1.) shell> mkdir ~/.irssi/scripts                    |\n".
21  "| 2.) shell> cp twsocials.pl ~/.irssi/scripts/         |\n".
22  "| 3.) shell> mkdir ~/.irssi/scripts/autorun            |\n".
23  "| 4.) shell> ln -s ~/.irssi/scripts/twsocials.pl \\     |\n".
24  "|            ~/.irssi/scripts/autorun/twsocials.pl     |\n".
25  "| 5.) /help            (Will list all your socials)    |\n".
26  "|     /socials         (Shows you a list of arguments) |\n".
27  "|     /socials list    (Shows a list of socials)       |\n".
28  "|     /socials <social>(Contents of the Social command)|\n".
29  "| 6.) /toggle twsocials_instruct and last /save        |\n".
30  "|------------------------------------------------------|\n".
31  "|  Options:                                   Default: |\n".
32  "|  /toggle twsocials_remote                     OFF    |\n".
33  "|  /toggle twtopic_instruct     |Startup instructions  |\n".
34  "|------------------------------------------------------|\n".
35  "|  Note:                                               |\n".
36  "|  If twsocials_remote is ON, that will enable public  |\n".
37  "|  and private social commands to work, such as the    |\n".
38  "|  the following.                                      |\n".
39  "|                                                      |\n".
40  "|  < TechWizard> !social                               |\n".
41  "|  < TechWizard> !social list                          |\n".
42  "|  < TechWizard> !social blist                         |\n".
43  "|  < TechWizard> !hug                                  |\n".
44  "|  < TechWizard> !hug JohnDoe                          |\n".
45  "|  < TechWizard> !hug JohnDoe 1                        |\n".
46  "\`------------------------------------------------------'";
47
48
49my $maxsize=62;
50my $lastcmd="";
51my $home_chan="";
52my $path = "~/.irssi/socials";
53my @colname = ("Dark Black","Dark Red","Dark Green","Dark Yellow","Dark Blue","Dark Magenta","Dark Cyan","Dark White","Bold Black","Bold Red","Bold Green","Bold Yellow","Bold Blue","Bold Magenta","Bold Cyan","Bold White","Reset","O");
54my @mirc_color_name = ("~R0","~R1","~R2","~R3","~R4","~R5","~R6","~R7","~B0","~B1","~B2","~B3","~B4","~B5","~B6","~B7","~RS");
55my @mirc_color_arr = ("\0031","\0035","\0033","\0037","\0032","\0036","\00310","\0030","\00314","\0034","\0039","\0038","\00312","\00313","\00311","\00315","\017");
56my ($r0,$r1,$r2,$r3,$r4,$r5,$r6,$r7,$b0,$b1,$b2,$b3,$b4,$b5,$b6,$b7,$rs) = @mirc_color_arr;
57   $path =~ s/^~\//$ENV{'HOME'}\//;
58my $bc=$r4;
59my $bt=$r2;
60my $m1=$r1;
61my $m2=$b1;
62
63################ Checking Social's home Directory #############
64init_socpath();
65###############################################################
66
67sub message_public {
68  my($server, $data, $nick, $address, $target) = @_;
69  if(!Irssi::settings_get_bool('twsocials_remote')) { return; }
70  $home_chan=$target;
71  $data =~ s/\r//;
72  my $socname;
73  my @data_arr = split " ", $data;
74  if(@data_arr[0] eq "!social") {
75     if(!$#data_arr) {
76        syntax($server,$target);
77        return;
78        }
79     if(@data_arr[1] eq "color") {
80        colorlist($server,$target);
81        return;
82        }
83     if(@data_arr[1] eq "list") {
84        soclist($server,$target);
85        return;
86        }
87     if(@data_arr[1] eq "blist") {
88        socblist($server,$target);
89        return;
90        }
91     if(@data_arr[1] eq "add") {
92        if($#data_arr == 1) {
93           $server->command("msg $target $r3(USAGE) $rs!social$b4 add$rs <social>$r3 :$rs$r2 Adds a new Social.");
94           return;
95           }
96        $socname = @data_arr[2];
97        addsoc($server,$target,$socname);
98        return;
99        }
100     if(@data_arr[1] eq "del") {
101        if($#data_arr == 1) {
102           $server->command("msg $target $r3(USAGE) $rs!social$b4 dels$rs <social> $r3:$r2 Deletes a Social.");
103           return;
104           }
105        $socname = @data_arr[2];
106        delsoc($server,$target,$socname);
107        return;
108        }
109     if(@data_arr[1] eq "set") {
110        if($#data_arr <= 3) {
111           set_syntax($server, $target, $socname);
112           return;
113           }
114        $socname = @data_arr[2];
115        my $set = @data_arr[3];
116        my $cutstr = "@data_arr[0] @data_arr[1] @data_arr[2] @data_arr[3] ";
117        $data =~ s/$cutstr//;
118        setsoc($server,$target,$socname,$set,$data);
119        return;
120        }
121     $socname = @data_arr[1];
122     print_social($server, $target, $socname);
123     return;
124     }
125  if(@data_arr[0] eq "!soclist") {
126     soclist($server,$target);
127     return;
128     }
129  my $chr="!";
130  $socname = @data_arr[0];
131  my @socname_arr = split //, $socname;
132  if(@socname_arr[0] ne $chr) { return; }
133  $socname =~ s/$chr//;
134  my ($nick2,$msgsw);
135  if(!ifexist_social($socname)) { return; }
136  if($#data_arr == 0) {
137     $nick2 = "UNSET";
138     $msgsw=0;
139     }
140  if($#data_arr == 1) {
141     $nick2 = @data_arr[1];
142     $msgsw=0;
143     }
144  if($#data_arr == 2) {
145     $nick2 = @data_arr[1];
146     $msgsw=1;
147     }
148  my $chan = Irssi::Irc::Server->channel_find($home_chan);
149  my $nick_obj = $chan->nick_find($nick2);
150  if($nick_obj->{nick} eq "" && $nick2 ne "UNSET") {
151     $server->command("msg $target nickname does not exist.");
152     return;
153     }
154  do_social($server,$target,$socname,$nick,$nick2,$msgsw);
155}
156
157sub message_private {
158  my($server, $data, $nick, $address) = @_;
159  if(!Irssi::settings_get_bool('twsocials_remote')) { return; }
160  my $target=$nick;
161  $home_chan=$target;
162  $data =~ s/\r//;
163  my $socname;
164  my @data_arr = split " ", $data;
165  if(@data_arr[0] eq "!social") {
166     if(!$#data_arr) {
167        syntax($server,$target);
168        return;
169        }
170     if(@data_arr[1] eq "color") {
171        colorlist($server,$target);
172        return;
173        }
174     if(@data_arr[1] eq "list") {
175        soclist($server,$target);
176        return;
177        }
178     if(@data_arr[1] eq "blist") {
179        socblist($server,$target);
180        return;
181        }
182     if(@data_arr[1] eq "add") {
183        if($#data_arr == 1) {
184           $server->command("msg $target $r3(USAGE) $rs!social$b4 add$rs <social>$r3 :$rs$r2 Adds a new Social.");
185           return;
186           }
187        $socname = @data_arr[2];
188        addsoc($server,$target,$socname);
189        return;
190        }
191     if(@data_arr[1] eq "del") {
192        if($#data_arr == 1) {
193           $server->command("msg $target $r3(USAGE) $rs!social$b4 dels$rs <social> $r3:$r2 Deletes a Social.");
194           return;
195           }
196        $socname = @data_arr[2];
197        delsoc($server,$target,$socname);
198        return;
199        }
200     if(@data_arr[1] eq "set") {
201        if($#data_arr <= 3) {
202           set_syntax($server, $target, $socname);
203           return;
204           }
205        $socname = @data_arr[2];
206        my $set = @data_arr[3];
207        my $cutstr = "@data_arr[0] @data_arr[1] @data_arr[2] @data_arr[3] ";
208        $data =~ s/$cutstr//;
209        setsoc($server,$target,$socname,$set,$data);
210        return;
211        }
212     $socname = @data_arr[1];
213     print_social($server, $target, $socname);
214     return;
215     }
216  if(@data_arr[0] eq "!soclist") {
217     soclist($server,$target);
218     return;
219     }
220  my $chr="!";
221  $socname = @data_arr[0];
222  my @socname_arr = split //, $socname;
223  if(@socname_arr[0] ne $chr) { return; }
224  $socname =~ s/$chr//;
225  my ($nick2,$msgsw);
226  if(!ifexist_social($socname)) { return; }
227  if($#data_arr == 0) {
228     $nick2 = "UNSET";
229     $msgsw=0;
230     }
231  if($#data_arr == 1) {
232     $nick2 = @data_arr[1];
233     $msgsw=0;
234     }
235  if($#data_arr == 2) {
236     $nick2 = @data_arr[1];
237     $msgsw=1;
238     }
239  my $nick1 = $nick;
240  do_social($server,$target,$socname,$nick1,$nick2,$msgsw);
241}
242
243sub on_public {
244  my($server, $data, $nick, $address, $target) = @_;
245  if(!Irssi::settings_get_bool('twsocials_remote')) { return; }
246  if($data !~ /^!/) { return; }
247  $home_chan=$nick;
248  $target=Irssi::active_win()->{active}->{name};
249  $home_chan=$target;
250  $data =~ s/\r//;
251  my $socname;
252  my @data_arr = split " ", $data;
253  if(@data_arr[0] eq "!social") {
254     if(!$#data_arr) {
255        syntax($server,$target);
256        return;
257        }
258     if(@data_arr[1] eq "color") {
259        colorlist($server,$target);
260        return;
261        }
262     if(@data_arr[1] eq "list") {
263        soclist($server,$target);
264        return;
265        }
266     if(@data_arr[1] eq "blist") {
267        socblist($server,$target);
268        return;
269        }
270     if(@data_arr[1] eq "add") {
271        if($#data_arr == 1) {
272           $server->command("msg $target $r3(USAGE) $rs!social$b4 add$rs <social>$r3 :$rs$r2 Adds a new Social.");
273           return;
274           }
275        $socname = @data_arr[2];
276        addsoc($server,$target,$socname);
277        return;
278        }
279     if(@data_arr[1] eq "del") {
280        if($#data_arr == 1) {
281           $server->command("msg $target $r3(USAGE) $rs!social$b4 dels$rs <social> $r3:$r2 Deletes a Social.");
282           return;
283           }
284        $socname = @data_arr[2];
285        delsoc($server,$target,$socname);
286        return;
287        }
288     if(@data_arr[1] eq "set") {
289        if($#data_arr <= 3) {
290           set_syntax($server, $target, $socname);
291           return;
292           }
293        $socname = @data_arr[2];
294        my $set = @data_arr[3];
295        my $cutstr = "@data_arr[0] @data_arr[1] @data_arr[2] @data_arr[3] ";
296        $data =~ s/$cutstr//;
297        setsoc($server,$target,$socname,$set,$data);
298        return;
299        }
300     $socname = @data_arr[1];
301     print_social($server, $target, $socname);
302     return;
303     }
304  if(@data_arr[0] eq "!soclist") {
305     soclist($server,$target);
306     return;
307     }
308  my $chr="!";
309  $socname = @data_arr[0];
310  my @socname_arr = split //, $socname;
311  if(@socname_arr[0] ne $chr) { return; }
312  $socname =~ s/$chr//;
313  my ($nick2,$msgsw);
314  if(!ifexist_social($socname)) {
315     return;
316     }
317  if($#data_arr == 0) {
318     $nick2 = "UNSET";
319     $msgsw=0;
320     }
321  if($#data_arr == 1) {
322     $nick2 = @data_arr[1];
323     $msgsw=0;
324     }
325  if($#data_arr == 2) {
326     $nick2 = @data_arr[1];
327     $msgsw=1;
328     }
329  my $nick1 = $server->{nick};
330  my $chan = Irssi::Irc::Server->channel_find($home_chan);
331  my $nick_obj = $chan->nick_find($nick2);
332  if($nick_obj->{nick} eq "" && $nick2 ne "UNSET") {
333     $server->command("msg $target nickname does not exist.");
334     return;
335     }
336  do_social($server,$target,$socname,$nick1,$nick2,$msgsw);
337}
338
339sub on_private {
340  my($server, $data, $nick, $address, $target) = @_;
341  if(!Irssi::settings_get_bool('twsocials_remote')) { return; }
342  if($data !~ /^!/) { return; }
343  $home_chan=$nick;
344  $target=$nick;
345  $data =~ s/\r//;
346  my $socname;
347  my @data_arr = split " ", $data;
348  if(@data_arr[0] eq "!social") {
349     if(!$#data_arr) {
350        syntax($server,$target);
351        return;
352        }
353     if(@data_arr[1] eq "color") {
354        colorlist($server,$target);
355        return;
356        }
357     if(@data_arr[1] eq "list") {
358        soclist($server,$target);
359        return;
360        }
361     if(@data_arr[1] eq "blist") {
362        socblist($server,$target);
363        return;
364        }
365     if(@data_arr[1] eq "add") {
366        if($#data_arr == 1) {
367           $server->command("msg $target $r3(USAGE) $rs!social$b4 add$rs <social>$r3 :$rs$r2 Adds a new Social.");
368           return;
369           }
370        $socname = @data_arr[2];
371        addsoc($server,$target,$socname);
372        return;
373        }
374     if(@data_arr[1] eq "del") {
375        if($#data_arr == 1) {
376           $server->command("msg $target $r3(USAGE) $rs!social$b4 dels$rs <social> $r3:$r2 Deletes a Social.");
377           return;
378           }
379        $socname = @data_arr[2];
380        delsoc($server,$target,$socname);
381        return;
382        }
383     if(@data_arr[1] eq "set") {
384        if($#data_arr <= 3) {
385           set_syntax($server, $target, $socname);
386           return;
387           }
388        $socname = @data_arr[2];
389        my $set = @data_arr[3];
390        my $cutstr = "@data_arr[0] @data_arr[1] @data_arr[2] @data_arr[3] ";
391        $data =~ s/$cutstr//;
392        setsoc($server,$target,$socname,$set,$data);
393        return;
394        }
395     $socname = @data_arr[1];
396     print_social($server, $target, $socname);
397     return;
398     }
399  if(@data_arr[0] eq "!soclist") {
400     soclist($server,$target);
401     return;
402     }
403  my $chr="!";
404  $socname = @data_arr[0];
405  my @socname_arr = split //, $socname;
406  if(@socname_arr[0] ne $chr) { return; }
407  $socname =~ s/$chr//;
408  my ($msgsw,$nick2);
409  if(!ifexist_social($socname)) {
410     return;
411     }
412  if($#data_arr == 0) {
413     $nick2 = "UNSET";
414     $msgsw=0;
415     }
416  if($#data_arr == 1) {
417     $nick2 = @data_arr[1];
418     $msgsw=0;
419     }
420  if($#data_arr == 2) {
421     $nick2 = @data_arr[1];
422     $msgsw=1;
423     }
424  my $nick1 = $server->{nick};
425  $target = $nick;
426  do_social($server,$target,$socname,$nick1,$nick2,$msgsw);
427}
428
429sub addsoc {
430   my ($server,$target,$socname) = @_;
431   if(ifexist_social($socname)) {
432      $server->command("msg $target r3social: $rs$socname already exist.");
433      return;
434      }
435   #write_social($socname,$fpriv,$fself,$fnobody,$fpublic,$fyou,$fthem)
436   write_social($socname,"0","UNSET","UNSET","UNSET","UNSET","UNSET");
437   irssicmd_socials($socname);
438   $server->command("msg $target $r2 done.");
439   return;
440}
441
442sub irssi_addsoc {
443   my ($data, $server, $witem) = @_;
444   my @data_arr = split / /, $data;
445   if(@data_arr[0] eq "") {
446      irssi_syntax();
447      return;
448      }
449   my $socname = @data_arr[0];
450   if(ifexist_social($socname)) {
451      print "$rs$socname already exist.";
452      return;
453      }
454   write_social($socname,"0","UNSET","UNSET","UNSET","UNSET","UNSET");
455   irssicmd_socials($socname);
456   print "$r2 done.";
457   return;
458}
459
460sub delsoc {
461   my ($server,$target,$socname) = @_;
462   if(!ifexist_social($socname)) {
463      $server->command("msg $target $r3 DELETE $socname: $rs$socname social does not exist.");
464      return;
465      }
466   my $filename ="$path/$socname.txt";
467   unlink($filename);
468   irssicmd_socials($socname);
469   $server->command("msg $target $r2 done.");
470   return;
471}
472
473sub irssi_delsoc {
474   my ($data, $server, $witem) = @_;
475   my @data_arr = split / /, $data;
476   if(@data_arr[0] eq "") {
477      irssi_syntax();
478      return;
479      }
480   my $socname = @data_arr[0];
481   if(!ifexist_social($socname)) {
482      print "$r3 DELETE $socname: $rs$socname social does not exist.";
483      return;
484      }
485   my $filename ="$path/$socname.txt";
486   unlink($filename);
487   irssicmd_socials($socname);
488   print "$r2 done.";
489   return;
490}
491
492sub setsoc {
493   my ($server,$target,$socname,$set,$data) = @_;
494   my @sets = ("priv","nobody","public","self","them","you");
495   if(!ifexist_social($socname)) {
496      $server->command("msg $target $r3 SET social: $rs$socname does not exist.");
497      return;
498      }
499   $set = "\L$set";
500   my $found=0;
501   foreach(@sets) { if($set eq $_) { $found=1; } }
502   if(!$found) {
503      $server->command("msg $target $r3 social:$rs invalid field name.");
504      return;
505      }
506   my $filename = "$path/$socname.txt";
507   my $cx=0;
508   my ($fpriv, $fnobody, $fpublic, $fself, $fthem, $fyou);
509   open(FILE,"<", $filename) or do {
510      print "File $filename not found.";
511      return;
512      };
513   while (<FILE>) {
514      chomp;
515      $fpriv = $_ if($cx == 0);
516      $fnobody = $_ if($cx == 1);
517      $fpublic = $_ if($cx == 2);
518      $fself = $_ if($cx == 3);
519      $fthem = $_ if($cx == 4);
520      $fyou = $_ if($cx == 5);
521      $cx++;
522      }
523   close FILE;
524   $fpriv   = $data if($set eq "priv");
525   $fnobody = $data if($set eq "nobody");
526   $fpublic = $data if($set eq "public");
527   $fself   = $data if($set eq "self");
528   $fthem   = $data if($set eq "them");
529   $fyou    = $data if($set eq "you");
530   write_social($socname,$fpriv,$fself,$fnobody,$fpublic,$fyou,$fthem);
531   $server->command("msg $target $r2 done.");
532   irssicmd_socials($socname);
533   return;
534}
535
536sub irssi_setsoc {
537   my ($data, $server, $witem) = @_;
538   my @data_arr = split / /, $data;
539   if($#data_arr <=1) {
540      irssi_set_syntax();
541      return;
542      }
543   my $cutstr = "/";
544   my $socname = @data_arr[0];
545   my $set = @data_arr[1];
546   $cutstr = "$socname $set ";
547   $data =~ s/$cutstr//g;
548   my @sets = ("priv","nobody","public","self","them","you");
549   if(!ifexist_social($socname)) {
550      print "$r3 SET social: $rs$socname does not exist.";
551      return;
552      }
553   $set = "\L$set";
554   my $found=0;
555   foreach(@sets) { if($set eq $_) { $found=1; } }
556   if(!$found) {
557      print "$r3 social:$rs invalid field name.";
558      return;
559      }
560   my $filename = "$path/$socname.txt";
561   my $cx=0;
562   my ($fpriv, $fnobody, $fpublic, $fself, $fthem, $fyou);
563   open(FILE,"<", $filename) or do {
564      print "File $filename not found.";
565      return;
566      };
567   while (<FILE>) {
568      chomp;
569      $fpriv = $_ if($cx == 0);
570      $fnobody = $_ if($cx == 1);
571      $fpublic = $_ if($cx == 2);
572      $fself = $_ if($cx == 3);
573      $fthem = $_ if($cx == 4);
574      $fyou = $_ if($cx == 5);
575      $cx++;
576      }
577   close FILE;
578   $fpriv   = $data if($set eq "priv");
579   $fnobody = $data if($set eq "nobody");
580   $fpublic = $data if($set eq "public");
581   $fself   = $data if($set eq "self");
582   $fthem   = $data if($set eq "them");
583   $fyou    = $data if($set eq "you");
584   write_social($socname,$fpriv,$fself,$fnobody,$fpublic,$fyou,$fthem);
585   print "$r2 done.";
586   irssicmd_socials($socname);
587   return;
588}
589
590sub syntax {
591   my ($server,$target) = @_;
592   $server->command("msg $target $r3(USAGE) $rs!social             $r3 :$r2 Prints this screen.");
593   $server->command("msg $target         !social <social>   $r3  :$r2 Displays the social msgs");
594   $server->command("msg $target         !social$b4 add $rs<social>$r3 :$r2 Adds a new Social.");
595   $server->command("msg $target         !social$b4 del $rs<social>$r3 :$r2 Dels a Social.");
596   $server->command("msg $target         !social$b4 set $rs<social>$r3 :$r2 Sets The social msg per line.");
597   $server->command("msg $target         !social$b4 list    $r3     :$r2 A list of socials.");
598   $server->command("msg $target         !social$b4 blist   $r3     :$r2 A list of socials in a box.");
599   $server->command("msg $target         !social$b4 color   $r3     :$r2 A list of color codes.");
600   $server->command("msg $target         !soclist           $r3  :$r2 Prints a list of socials.");
601   $server->command("msg $target         !<social>          $r3  :$r2 does the Social.");
602}
603
604sub irssi_syntax {
605   my ($server,$target) = @_;
606   print "$r3(USAGE) $rs!social             $r3 :$r2 Prints this screen.";
607   print "        !social <social>   $r3  :$r2 Displays the social msgs";
608   print "        !social$b4 add $rs<social>$r3 :$r2 Adds a new Social.";
609   print "        !social$b4 del $rs<social>$r3 :$r2 Dels a Social.";
610   print "        !social$b4 set $rs<social>$r3 :$r2 Sets The social msg per line.";
611   print "        !social$b4 list    $r3     :$r2 A list of socials.";
612   print "        !social$b4 blist   $r3     :$r2 A list of socials in a box.";
613   print "        !social$b4 color   $r3     :$r2 A list of color codes.";
614   print "        !soclist           $r3  :$r2 Prints a list of socials.";
615   print "        !<social>          $r3  :$r2 does the Social.";
616}
617
618sub colorlist {
619   my ($server,$target) = @_;
620   my $title = "$bc($bt Color List $bc)";
621   my $spc = ' 'x50;
622   my $text = "";
623   my $tmp = "";
624   my $cx=0;
625   my $bar = "------------------------------------------------------------------";
626   $bar = ".".substr($bar,0,int(($maxsize-13)/2)).$title.substr($bar,0,int(($maxsize-13)/2)).".";
627   $server->command("msg $target $bc$bar$rs");
628
629   my ($text,$blah);
630   foreach (@colname)  {
631   my $col = substr("@mirc_color_name[$cx] = @colname[$cx]$spc",0,20);
632      $tmp = $text.$col;
633      if(strsize($tmp) >= $maxsize) {
634         $text.=' 'x50;
635         $blah =~ s/\003//;
636         $blah = @mirc_color_arr[$cx];
637         $text = substr(" $text",0,$maxsize);
638         $text = "$bc|$rs$text$bc|$rs";
639         $server->command("msg $target $text");
640         $text="";
641         }
642      $text=$text.$col;
643      $cx++;
644      }
645   $bar = "-------------------------------------------------------------------------------------------";
646   $bar = "`".substr($bar,0,$maxsize)."\'";
647   $server->command("msg $target $bc$bar$rs");
648   return;
649}
650
651sub irssi_colorlist {
652   my ($server,$target) = @_;
653   my $spc = ' 'x50;
654   my $title = "$bc($bt Color List $bc)";
655   my $bar = "------------------------------------------------------------------";
656   $bar = ".".substr($bar,0,int(($maxsize-13)/2)).$title.substr($bar,0,int(($maxsize-13)/2)).".";
657   print "$bc$bar$rs";
658   my $cx=0;
659   my ($text,$blah);
660   foreach (@colname)  {
661   my $col = substr("@mirc_color_name[$cx] = @colname[$cx]$spc",0,20);
662      my $tmp = $text.$col;
663      if(strsize($tmp) >= $maxsize) {
664         $text.=' 'x50;
665         $blah =~ s/\003//;
666         $blah = @mirc_color_arr[$cx];
667         $text = substr(" $text",0,$maxsize);
668         $text = "$bc|$rs$text$bc|$rs";
669         print $text;
670         $text="";
671         }
672      $text=$text.$col;
673      $cx++;
674      }
675   $bar = "-------------------------------------------------------------------------------------------";
676   $bar = "`".substr($bar,0,$maxsize)."\'";
677   print "$bc$bar$rs";
678   return;
679}
680
681sub set_syntax {
682   my ($server,$target) = @_;
683   $server->command("msg $target $r3(USAGE) $rs!social$b4 set$rs <social>$b4 nobody $rs<msg>: Sets the message when no nickname is set.");
684   $server->command("msg $target        !social$b4 set $rs<social>$b4 public $rs<msg> : Sets the message for the channel");
685   $server->command("msg $target        !social$b4 set $rs<social>$b4 self   $rs<msg> : Sets the message when you social yourself.");
686   $server->command("msg $target        !social$b4 set $rs<social>$b4 you    $rs<msg> : Sets message that will be messaged to you.");
687   $server->command("msg $target        !social$b4 set $rs<social>$b4 them   $rs<msg> : Sets The social message that will be sent to them.");
688   return;
689}
690
691sub irssi_set_syntax {
692   my ($server,$target) = @_;
693   print "$r3(USAGE)";
694   print "!social$b4 set$rs <social>$b4 nobody $rs<msg>: Sets the message when no nickname is set.";
695   print "!social$b4 set $rs<social>$b4 public $rs<msg>: Sets the message for the channel";
696   print "!social$b4 set $rs<social>$b4 self   $rs<msg>: Sets the message when you social yourself.";
697   print "!social$b4 set $rs<social>$b4 you    $rs<msg>: Sets message that will be messaged to you.";
698   print "!social$b4 set $rs<social>$b4 them   $rs<msg>: Sets The social message that will be sent to them.";
699   return;
700}
701
702sub soclist{
703   my ($server,$target) = @_;
704   my $text="";
705   my $cutstr=".txt";
706   my @array;
707   opendir(DIR,$path) or return 0;
708   while (defined(my $file = readdir(DIR))) {
709      if($file =~ m".txt") {
710         my $tmp=$file;
711         $tmp =~ s/$cutstr//;
712         push(@array,$tmp);
713         }
714      }
715   closedir(DIR);
716   @array = sort(@array);
717   foreach(@array) { $text.=" $_"; }
718   $server->command("msg $target $text");
719   return;
720}
721
722sub socblist {
723   my ($server,$target) = @_;
724   my @array;
725   my $text="";
726   opendir(DIR,$path) or return 0;
727   my $title = "$bc($bt Social List $bc)";
728   my $bar = "------------------------------------------------------------------";
729   $bar = ".".substr($bar,0,int(($maxsize-15)/2)).$title.substr($bar,0,int(($maxsize-15)/2)+1).".";
730   $server->command("msg $target $bc$bar$rs");
731   my $spc = "                                ";
732   my $cutstr=".txt";
733   opendir(DIR,$path) or return 0;
734   while (defined(my $file = readdir(DIR))) {
735      if($file =~ m".txt") {
736         my $tmp=$file;
737         $tmp =~ s/$cutstr//;
738         push(@array,$tmp);
739         }
740      }
741   closedir(DIR);
742   @array = sort(@array);
743   foreach(@array) {
744     my $name;
745     my $socname=$_;
746     $socname =~ s/$cutstr//;
747     if(!get_social_str($socname,"priv")) {
748        $name = substr(" $socname$spc",0,10);
749        }
750     else {
751        $name = substr("*$socname$spc",0,10);
752        }
753     my $tmp = $text.$name;
754     if(strsize($tmp) >= $maxsize) {
755         $text.="                                                                           ";
756         $text = substr(" $text",0,($maxsize));
757         $text = "$bc|$rs$text$bc|$rs";
758         $server->command("msg $target $text");
759         $text="";
760         }
761      $text=$text.$name;
762      }
763   $text.="                                                                           ";
764   $text = substr(" $text",0,($maxsize));
765   $text = "$bc|$rs$text$bc|$rs";
766   $server->command("msg $target $text");
767   $bar = "-------------------------------------------------------------------------------------------";
768   $bar = "`".substr($bar,0,$maxsize)."\'";
769   $server->command("msg $target $bc$bar$rs");
770   return;
771}
772
773sub irssi_socblist {
774   my ($data, $server, $witem) = @_;
775   my @array;
776   my $text="";
777   opendir(DIR,$path) or return 0;
778   my $title = "$bc($bt Social List $bc)";
779   my $bar = "------------------------------------------------------------------";
780   $bar = ".".substr($bar,0,int(($maxsize-15)/2)).$title.substr($bar,0,int(($maxsize-15)/2)+1).".";
781   print "$bc$bar$rs";
782   my $spc = "                                ";
783   my $cutstr=".txt";
784   opendir(DIR,$path) or return 0;
785   while (defined(my $file = readdir(DIR))) {
786      if($file =~ m".txt") {
787         my $tmp=$file;
788         $tmp =~ s/$cutstr//;
789         push(@array,$tmp);
790         }
791      }
792   closedir(DIR);
793   @array = sort(@array);
794   foreach(@array) {
795     my $name;
796     my $socname=$_;
797     $socname =~ s/$cutstr//;
798     if(!get_social_str($socname,"priv")) {
799        $name = substr(" $socname$spc",0,10);
800        }
801     else {
802        $name = substr("*$socname$spc",0,10);
803        }
804     my $tmp = $text.$name;
805     if(strsize($tmp) >= $maxsize) {
806         $text.="                                                                           ";
807         $text = substr(" $text",0,($maxsize));
808         $text = "$bc|$rs$text$bc|$rs";
809         print "$text";
810         $text="";
811         }
812      $text=$text.$name;
813      }
814   $text.="                                                                           ";
815   $text = substr(" $text",0,($maxsize));
816   $text = "$bc|$rs$text$bc|$rs";
817   print "$text";
818   $bar = "-------------------------------------------------------------------------------------------";
819   $bar = "`".substr($bar,0,$maxsize)."\'";
820   print "$bc$bar$rs";
821   return;
822}
823
824sub do_social {
825   my ($server,$target,$socname,$name1,$name2,$msgsw) = @_;
826   my $text;
827   if($name1 eq $name2) {
828      $text = get_social_str($socname,"self");
829      $text= social_parse($name1,$name2,$text);
830      $server->command("msg $target $text");
831      return;
832      }
833   if($name2 eq "UNSET") {
834      $text = get_social_str($socname,"nobody");
835      $text= social_parse($name1,$name2,$text);
836      $server->command("msg $target $text");
837      return;
838      }
839   if(get_social_str("priv")) {
840      $text = get_social_str($socname,"public");
841      $text= social_parse($name1,$name2,$text);
842      $server->command("msg $target $text");
843      if($msgsw) {
844         $text = get_social_str($socname,"you");
845         $text= social_parse($name1,$name2,$text);
846         $server->command("msg $name1 $text");
847         $text = get_social_str($socname,"them");
848         $text= social_parse($name1,$name2,$text);
849         $server->command("msg $name2 $text");
850         }
851      }
852   else {
853      $text = get_social_str($socname,"you");
854      $text= social_parse($name1,$name2,$text);
855      $server->command("msg $name1 $text");
856      $text = get_social_str($socname,"them");
857      $text= social_parse($name1,$name2,$text);
858      $server->command("msg $name2 $text");
859      }
860   return;
861}
862
863sub print_social {
864   my ($server,$target,$socname) = @_;
865   my $text="";
866   my $filename = "$path/$socname.txt";
867   my $cx=0;
868   my ($fpriv, $fnobody, $fpublic, $fself, $fthem, $fyou);
869   open(FILE,"<", $filename) or do {
870      $server->command("msg $target $socname does not exist.");
871      return;
872      };
873   while (<FILE>) {
874      chomp;
875      $fpriv = $_ if($cx == 0);
876      $fnobody = $_ if($cx == 1);
877      $fpublic = $_ if($cx == 2);
878      $fself = $_ if($cx == 3);
879      $fthem = $_ if($cx == 4);
880      $fyou = $_ if($cx == 5);
881      $cx++;
882      }
883   close FILE;
884   $server->command("msg $target $r3    Name:$r2 $socname");
885   $server->command("msg $target $r3 Private:$r2 $fpriv");
886   $server->command("msg $target $r3  Nobody:$r2 ".colsocial($fnobody));
887   $server->command("msg $target $r3  Public:$r2 ".colsocial($fpublic));
888   $server->command("msg $target $r3    Self:$r2 ".colsocial($fself));
889   $server->command("msg $target $r3    Them:$r2 ".colsocial($fthem));
890   $server->command("msg $target $r3     You:$r2 ".colsocial($fyou));
891   return;
892}
893
894sub irssi_print_social {
895   my ($data, $server, $item) = @_;
896   my @data_arr = split / /, $data;
897   my $cutstr = "/";
898   if (@data_arr[0] =~ m/^[(set)|(blist)|(add)|(list)|(del)|(color)]/i && !ifexist_social(@data_arr[0])) {
899    Irssi::command_runsub ('social', $data, $server, $item);
900    return;
901    }
902   my $socname = @data_arr[0];
903   my $text="";
904   my $filename = "$path/$socname.txt";
905   my $cx=0;
906   my ($fpriv, $fnobody, $fpublic, $fself, $fthem, $fyou);
907   open(FILE,"<", $filename) or do {
908      print "$socname does not exist.";
909      return;
910      };
911   while (<FILE>) {
912      chomp;
913      $fpriv = $_ if($cx == 0);
914      $fnobody = $_ if($cx == 1);
915      $fpublic = $_ if($cx == 2);
916      $fself = $_ if($cx == 3);
917      $fthem = $_ if($cx == 4);
918      $fyou = $_ if($cx == 5);
919      $cx++;
920      }
921   close FILE;
922   print"$r3    Name:$r2 $socname";
923   print"$r3 Private:$r2 $fpriv";
924   print"$r3  Nobody:$r2 ".colsocial($fnobody);
925   print"$r3  Public:$r2 ".colsocial($fpublic);
926   print"$r3    Self:$r2 ".colsocial($fself);
927   print"$r3    Them:$r2 ".colsocial($fthem);
928   print"$r3     You:$r2 ".colsocial($fyou);
929   return;
930}
931
932sub colsocial {
933    my ($str) = @_;
934    my $name1 = "$r2 name1$rs";
935    my $name2 = "$r2 name2$rs";
936    return $str;
937}
938
939sub color_parse {
940    my ($str) = @_;
941    my $cx=0;
942    foreach(@mirc_color_name) {
943       my $old = @mirc_color_name[$cx];
944       my $new = @mirc_color_arr[$cx];
945       $str =~ s/$old/$new/g;
946       $cx++;
947       }
948    return $str;
949}
950
951sub social_parse {
952   my ($name1,$name2,$str) = @_;
953   $name1 = "$r2$name1$rs";
954   $name2 = "$r2$name2$rs";
955   $str =~ s/name1/$name1/g;
956   $str =~ s/name2/$name2/g;
957   return $str;
958}
959
960sub get_social_str {
961   my ($social,$colum) = @_;
962   my $filename = "$path/$social.txt";
963   my $cx=0;
964   my ($fpriv, $fnobody, $fpublic, $fself, $fthem, $fyou);
965   open(FILE,"<", $filename);
966   while (<FILE>) {
967      chomp;
968      $fpriv = color_parse($_) if($cx == 0);
969      $fnobody = color_parse($_) if($cx == 1);
970      $fpublic = color_parse($_) if($cx == 2);
971      $fself = color_parse($_) if($cx == 3);
972      $fthem = color_parse($_) if($cx == 4);
973      $fyou = color_parse($_) if($cx == 5);
974      $cx++;
975   }
976   close FILE;
977   return $fpriv if($colum eq "priv");
978   return $fself if($colum eq "self");
979   return $fnobody if($colum eq "nobody");
980   return $fpublic if($colum eq "public");
981   return $fyou if($colum eq "you");
982   return $fthem if($colum eq "them");
983   return "UNSET";
984}
985
986sub ifexist_social {
987   my ($socname) = @_;
988   my $cutstr= ".txt";
989   my $filename = "$path/$socname.txt";
990   opendir(DIR,$path) or return 0;
991   while (defined(my $file = readdir(DIR))) {
992      if($file =~ m".txt") {
993         my $tmp=$file;
994         $tmp =~ s/$cutstr//;
995         return 1 if($socname eq $tmp);
996         }
997      }
998   return 0;
999}
1000
1001sub strsize {
1002   my ($word) = @_;
1003   my @word_arr = split //, $word;
1004   return $#word_arr+1;
1005}
1006
1007sub write_social {
1008   my ($socname,$fpriv,$fself,$fnobody,$fpublic,$fyou,$fthem) = @_;
1009   my $filename = "$path/$socname.txt";
1010   open(FILE,">", $filename);
1011   print FILE "$fpriv\n";
1012   print FILE "$fnobody\n";
1013   print FILE "$fpublic\n";
1014   print FILE "$fself\n";
1015   print FILE "$fthem\n";
1016   print FILE "$fyou\n";
1017   close FILE;
1018   return;
1019}
1020
1021sub irssicmd_reset {
1022   for my $cmd (Irssi::commands()) {
1023      if($cmd->{category} eq "Social Commands") {
1024         my $tmp=$cmd->{cmd};
1025         Irssi::command_unbind($tmp,'on_cmd');
1026      }
1027   }
1028}
1029
1030sub irssicmd_socials {
1031   my ($socname) = @_;
1032   irssicmd_reset();
1033   my $cutstr= ".txt";
1034   my $filename = "$path/$socname.txt";
1035   opendir(DIR,$path) or return 0;
1036   while (defined(my $file = readdir(DIR))) {
1037      if($file =~ m".txt") {
1038         my $tmp=$file;
1039         $tmp =~ s/$cutstr//;
1040         Irssi::command_bind($tmp,'on_cmd','Social Commands');
1041         }
1042      }
1043}
1044
1045sub on_cmd {
1046   my ($data, $server, $witem) = @_;
1047   my @data_arr = split / /, $lastcmd;
1048   my $cutstr = "/";
1049   my $socname = @data_arr[0];
1050   $socname =~ s/$cutstr//;
1051   my $target=Irssi::active_win()->{active}->{name};
1052   $home_chan=$target;
1053   my $nick = "TechWizard";
1054   my ($msgsw, $nick2);
1055   if($#data_arr == 0) {
1056      $nick2 = "UNSET";
1057      $msgsw=0;
1058      }
1059   if($#data_arr == 1) {
1060      $nick2 = @data_arr[1];
1061      $msgsw=0;
1062      }
1063   if($#data_arr == 2) {
1064      $nick2 = @data_arr[1];
1065      $msgsw=1;
1066      }
1067   if($home_chan =~ /^#/) {
1068      my $chan = Irssi::Irc::Server->channel_find($home_chan);
1069      my $nick_obj = $chan->nick_find($nick2);
1070      if($nick_obj->{nick} eq "" && $nick2 ne "UNSET") {
1071         $server->command("msg $target nickname does not exist.");
1072         return;
1073         }
1074      }
1075   do_social($server,$target,$socname,$nick,$nick2,$msgsw);
1076}
1077
1078sub cmd_sig {
1079   my($args) = @_;
1080   irssicmd_socials();
1081   $lastcmd=$args;
1082}
1083
1084sub check_dir {
1085    my $sw=1;
1086    opendir(DIR,$path) or $sw=0;
1087    closedir(DIR);
1088    return $sw;
1089}
1090
1091sub init_socpath {
1092   if(check_dir()) { return; }
1093   my @socnam_arr = ("beer","bslap","chains","cut","drp","fart","french","halo",
1094                  "hug","hump","kiss","smacks","smooch","spank","stab","staple",
1095                  "strip","trout","whips","yawn"
1096   );
1097   my @socline_arr = (
1098               "0\nWho wants Beer!?!?!?\nname1 throws name2 a fresh cold beer out of the fridge.\nname1 opens up a nice cold beer, and drinks it.\nname1 tosses you a nice cold beer, better catch it!!\nyou just tossed name2 a nice cold beer.\n",
1099               "0\nLook OUT!!!! name1 is ready to Bitch slap someone!!!!\nname1 Bitch slaps name2 Violently, OUWWW that gotta hurt!\nname1 Bitch Slaps themself hard, Are they Crazy or what???\nyou gotten Bitch Slapped by name1, can you call 911?.\nyou violently bitch slap name2.\n",
1100               "0\nname1 looks around swinging the chains around, who shall be my victim?\nname1 chains name2 up, Ohh... Boy, name2 is gonna get it...\nname1 chain themself up, and swallowed the keys.\nname1 chained you up, aren't you wondering what they will do next?\nyou just chained up name2, whats next? torchure?\n",
1101               "0\nname1 wants to cut something......\nname1 cut name2 arms and legs off with blood on your face\nname1 cut something on them off\nyou cut everything off of their body\nyou cut name2 arms and legs off and blood flies everywhere\n",
1102               "0\nname1 goes out and buys a box of ~R1Dr.Pepper~RS.\nname1 tosses a ~R1Dr.Pepper~RS can to name2, If you waste it, You're Dead.\nname1 grabs a ~R1Dr.Pepper~RS, pops it open and gulps it down... aaahhhh.....\nname1 tosses you a can of ~R1Dr.Pepper~RS.\nyou gave name2 a can of ~R1Dr.Pepper~RS.\n",
1103               "0\nname1 farts, Roam roam!!!! Can ya hear it?\nname1 farts towards name2!! QUICK Wear a Gas Mask!!!!\nname1 farts up a storm and kills themself.\nname1 farts towards you, EWWWWW!!! can ya smell it????\nyou farted towards name2! you B*stard!\n",
1104               "0\nname1 need to be french\nname1 french name2 until name2 cant breathe\nname1 want to be french\nname1 french them until name1 cant breathe\nyou french name2 with all you got\n",
1105               "0\nname1 looks around seeing whoes innocent.\nname1 does their best best to look innocent.\nname1 looks and the mirror and finds a gold circle.\nblah\n",
1106               "0\nname1 needs a hug.\nname1 hugs name2 tightly.\nname1 hugs themself tightly.\nname1 hugs you tightly.\nyou hugs name2 tightly.\n",
1107               "0\nname1 wants to be hump........\nname1 hump name2 until name1 drop\nname1 hump themself\nname1 hump them hard and passionately\nyou hump name2 with all you got\n",
1108               "0\nname1 needs a kiss.\nname1 kisses name2 passionately.\nname1 kisses themself passionately.\nname1 kisses them passionately.\nyou kisses name2 passionately.\n",
1109               "0\nname1 smacks his monkey slowly.\nname1 smacks name2 for being an idiot, What were they thinking???\nname1 smacks and smacks until his face burns red.\nname1 smacks you for being an idiot.\nyou smacked name2, that damn idiot, what were they thinking???\n",
1110               "0\nname1 smooches everyone in the channel.\nname1 smooches name2. AWW aint that cute.. NOT!!!\nname1 tries to smooch themself, but can't. Anyone got a mirror????\nname1 smooches you very passionately.\nyou have smooched name2 on the lips.\n",
1111               "0\nname1 looks for a paddle to spank someone's ass with.\nname1 spanks name2 ass for being naughty.....\nname1 is trying to spank their own ass, does somebody have a paddle?\nyou felt something on your ass, you turned around a look, did name1 spank you?\nhow did feel spanking name2's ass.\n",
1112               "0\nLook OUT!!!! name1 is ready to Stab someone with a knife!!!!\nname1 Stabs name2 Violently, I  hope they got life insurance\nname1 tries to Stab themself with a knife, 911, SUICIDE!!!\nname1 slaps ya with their dirty trout, are you going to let them get away with that???\nyou slapped name2 with your trout, I hope ya cleaned it first.\n",
1113               "0\nname1 grabs a staple gun and reloads the gun.\nname1 staples name2 to the wall, now they can't run, MUahahaha....\nname1 tries to staple themself to the wall, OUWWWW!!\nyou got stapled to the wall by name1.\nyou have stapled name2 to the wall.\n",
1114               "0\nname1 is waiting for someone to strip down, any volunteers?\nname1 strips name2 down one clothes after another.\nname1 watches themself in a mirror while stripping down.\nname1 is removing ya clothes.\nyou are removing name2's clothes, you better hope that camera is ready.\n",
1115               "0\nname1 is juggling the trout while looking for their victim.\nname1 slaps name2 with their dirty trout, *SPLAT*!!!\nname1 slaps himself with a dead trout, EWWWWWWW\nname1 slaps you with a dead trout, EWWWWWWW!!!\nyou slapped name2 with a dead trout, EWWWWWWW!!!\n",
1116               "0\nname1 is looking for a whip to torture someone.......RUN............\nname1 whips name2 until name1 sees blood.....\nname1 whips themself without mercy\nname1 whips them violently\nyou whips name2 with everything you have\n",
1117               "0\nname1 yawns and stretches.\nname1 yawns at name2, mann.. You're boring.\nname1 yawns and stretches and then falls over, WHOOPS!!\nname1 yawns at you, they are very bored.\nyou yawned at name2, how rude....\n",
1118   );
1119   my $cx=0;
1120   print "Mkdir $path.";
1121   mkdir($path);
1122   print "Inserting socials into $path.";
1123   foreach my $socname (@socnam_arr) {
1124      my $filename = "$path/$socname.txt";
1125      open(FILE,">", $filename);
1126      print FILE @socline_arr[$cx];
1127      close FILE;
1128      $cx++;
1129   }
1130}
1131
1132Irssi::command_bind('social','irssi_print_social','tech_addon');
1133Irssi::command_bind('social set','irssi_setsoc','tech_addon');
1134Irssi::command_bind('social color','irssi_colorlist','tech_addon');
1135Irssi::command_bind('social reset','irssicmd_reset','tech_addon');
1136Irssi::command_bind('social add','irssi_addsoc','tech_addon');
1137Irssi::command_bind('social del','irssi_delsoc','tech_addon');
1138Irssi::command_bind('social list','irssi_socblist','tech_addon');
1139Irssi::command_bind('soclist','irssi_socblist','tech_addon');
1140Irssi::command_bind('soccolor','irssi_socblist','tech_addon');
1141
1142Irssi::signal_add_first('send command', 'cmd_sig');
1143Irssi::signal_add_last('message public', 'message_public');
1144Irssi::signal_add_last('message private', 'message_private');
1145Irssi::signal_add_last("message own_public", "on_public");
1146Irssi::signal_add_last("message own_private", "on_private");
1147Irssi::settings_add_bool('tech_addon', 'twsocials_instruct', 1);
1148Irssi::settings_add_bool('tech_addon', 'twsocials_remote', 0);
1149irssicmd_socials();
1150
1151if(Irssi::settings_get_bool('twsocials_instruct')) {
1152   print $instrut;
1153   }
1154
1155