############################################################################### # Notify.pl # ############################################################################### # YaBB: Yet another Bulletin Board # # Open-Source Community Software for Webmasters # # Version: YaBB 2.5.2 # # Packaged: October 21, 2012 # # Distributed by: http://www.yabbforum.com # # =========================================================================== # # Copyright (c) 2000-2012 YaBB (www.yabbforum.com) - All Rights Reserved. # # Software by: The YaBB Development Team # # with assistance from the YaBB community. # ############################################################################### $notifyplver = 'YaBB 2.5.2 $Revision: 1.0 $'; if ($action eq 'detailedversion') { return 1; } &LoadLanguage('Notify'); sub ManageBoardNotify { my $todo = $_[0]; my $theboard = $_[1]; my $user = $_[2]; my $userlang = $_[3]; my $notetype = $_[4]; my $noteview = $_[5]; if ($todo eq "load" || $todo eq "update" || $todo eq "delete" || $todo eq "add") { undef %theboard; ## open board mail file and build hash name / detail if (-e "$boardsdir/$theboard.mail") { fopen(BOARDNOTE, "$boardsdir/$theboard.mail"); %theboard = map /(.*)\t(.*)/, ; fclose(BOARDNOTE); } } if ($todo eq "add") { $theboard{$user} = "$userlang|$notetype|$noteview"; &LoadUser($user); my %b; foreach (split(/,/, ${$uid.$user}{'board_notifications'})) { $b{$_} = 1; } $b{$theboard} = 1; ${$uid.$user}{'board_notifications'} = join(',', keys %b); &UserAccount($user); } elsif ($todo eq "update") { if (exists $theboard{$user}) { my ($memlang, $memtype, $memview) = split(/\|/, $theboard{$user}); if ($userlang) { $memlang = $userlang; } if ($notetype) { $memtype = $notetype; } if ($noteview) { $memview = $noteview; } $theboard{$user} = "$memlang|$memtype|$memview"; } } elsif ($todo eq "delete") { my %b; foreach my $u (split(',', $user)) { delete $theboard{$u}; &LoadUser($u); foreach (split(/,/, ${$uid.$u}{'board_notifications'})) { $b{$_} = 1; } if (delete $b{$theboard}) { ${$uid.$u}{'board_notifications'} = join(',', keys %b); &UserAccount($u); } undef %b; } } if ($todo eq "save" || $todo eq "update" || $todo eq "delete" || $todo eq "add") { if (%theboard) { fopen(BOARDNOTE, ">$boardsdir/$theboard.mail"); print BOARDNOTE map "$_\t$theboard{$_}\n", sort { $theboard{$a} cmp $theboard{$b} } keys %theboard; fclose(BOARDNOTE); undef %theboard; } else { unlink("$boardsdir/$theboard.mail"); } } } sub BoardNotify { if (!$currentboard) { &fatal_error("no_access"); } if ($iamguest) { &fatal_error("members_only"); } my ($curuser, $curlang, $notifytype); $selected1 = ""; $selected2 = ""; $deloption = ""; my ($boardname, undef) = split(/\|/, $board{$currentboard}, 2); &ToChars($boardname); &ManageBoardNotify("load", $currentboard); $yymain .= qq~
$notify_txt{'136'} - $boardname $notify_txt{'136'} - $boardname

~; if (exists $theboard{$username}) { ($memlang, $memtype, $memview) = split(/\|/, $theboard{$username}); ${ selected . $memtype } = qq~ selected="selected"~; $deloption = qq~~; $yymain .= qq~$notify_txt{'137'}  ~; } else { $yymain .= qq~$notify_txt{'126'}  ~; } $yymain .= qq~

~; undef %theboard; $yytitle = "$notify_txt{'125'}"; &template; } sub BoardNotify2 { if ($iamguest) { &fatal_error("members_only"); } foreach $variable (keys %FORM) { if ($variable eq 'formsession') { next; } $notify_type = $FORM{$variable}; if ($notify_type == 1 || $notify_type == 2) { &ManageBoardNotify("add", $variable, $username, ${$uid.$username}{'language'}, $notify_type, "1"); } elsif ($notify_type == 3) { &ManageBoardNotify("delete", $variable, $username); } } if ($action eq "boardnotify3") { $yySetLocation = qq~$scripturl?board=$INFO{'board'}~; } else { $yySetLocation = qq~$scripturl?action=shownotify~; } &redirectexit; } sub ManageThreadNotify { my $todo = $_[0]; my $thethread = $_[1]; my $user = $_[2]; my $userlang = $_[3]; my $notetype = $_[4]; my $noteview = $_[5]; if ($todo eq "load" || $todo eq "update" || $todo eq "delete" || $todo eq "add") { undef %thethread; ## open mail file and build hash if (-e "$datadir/$thethread.mail") { fopen(THREADNOTE, "$datadir/$thethread.mail"); %thethread = map /(.*)\t(.*)/, ; fclose(THREADNOTE); } } if ($todo eq "add") { $thethread{$user} = "$userlang|$notetype|$noteview"; &LoadUser($user); my %t; foreach (split(/,/, ${$uid.$user}{'thread_notifications'})) { $t{$_} = 1; } $t{$thethread} = 1; ${$uid.$user}{'thread_notifications'} = join(',', keys %t); &UserAccount($user); } elsif ($todo eq "update") { if (exists $thethread{$user}) { ($memlang, $memtype, $memview) = split(/\|/, $thethread{$user}); if ($userlang) { $memlang = $userlang; } if ($notetype) { $memtype = $notetype; } if ($noteview) { $memview = $noteview; } $thethread{$user} = "$memlang|$memtype|$memview"; } } elsif ($todo eq "delete") { my %t; foreach my $u (split(',', $user)) { delete $thethread{$u}; &LoadUser($u); foreach (split(/,/, ${$uid.$u}{'thread_notifications'})) { $t{$_} = 1; } if (delete $t{$thethread}) { ${$uid.$u}{'thread_notifications'} = join(',', keys %t); &UserAccount($u); } undef %t; } } if ($todo eq "save" || $todo eq "update" || $todo eq "delete" || $todo eq "add") { if (%thethread) { fopen(THREADNOTE, ">$datadir/$thethread.mail"); print THREADNOTE map "$_\t$thethread{$_}\n", sort { $thethread{$a} cmp $thethread{$b} } keys %thethread; fclose(THREADNOTE); undef %thethread; } else { unlink("$datadir/$thethread.mail"); } } } # sub Notify { delted because not needed any more since YaBB 2.3 (deti) sub Notify2 { if ($iamguest) { &fatal_error("members_only"); } &ManageThreadNotify("add", $INFO{'num'}, $username, ${$uid.$username}{'language'}, 1, 1); if ($INFO{'oldnotify'}) { &redirectinternal; } $elenable = 0; die ""; # This is here only to avoid server error log entries! } sub Notify3 { if ($iamguest) { &fatal_error("members_only"); } &ManageThreadNotify("delete", $INFO{'num'}, $username); if ($INFO{'oldnotify'}) { &redirectinternal; } $elenable = 0; die ""; # This is here only to avoid server error log entries! } sub Notify4 { if ($iamguest) { &fatal_error("members_only"); } my ($variable, $notype, $threadno); foreach $variable (keys %FORM) { ($notype, $threadno) = split(/-/, $variable); if ($notype eq "thread") { &ManageThreadNotify("delete", $threadno, $username); } } $action = 'shownotify'; &ShowNotifications; } sub updateLanguage { my ($user,$newlang) = @_; &getMailFiles; foreach (@bmaildir) { &ManageBoardNotify("update", $_, $user, $newlang, "", ""); } foreach (@tmaildir) { &ManageThreadNotify("update", $_, $user, $newlang, "", ""); } } sub removeNotifications { my $user_s = shift; &getMailFiles; foreach (@bmaildir) { &ManageBoardNotify("delete", $_, $user_s); } foreach (@tmaildir) { &ManageThreadNotify("delete", $_, $user_s); } } sub getMailFiles { opendir(BOARDNOT, "$boardsdir"); @bmaildir = map { (split(/\./, $_))[0] } grep { /\.mail$/ } readdir(BOARDNOT); closedir(BOARDNOT); opendir(THREADNOT, "$datadir"); @tmaildir = map { (split(/\./, $_))[0] } grep { /\.mail$/ } readdir(THREADNOT); closedir(THREADNOT); } sub ShowNotifications { ## bye bye guest.... if ($iamguest) { &fatal_error("members_only"); } $yynavigation = qq~› $img_txt{'mycenter'} › $img_txt{'418'}~; # Show Javascript for 'check all' notifications $showNotifications .= qq~
~; ($board_notify,$thread_notify) = &NotificationAlert; my ($num,$new); # Board notifications foreach (keys %$board_notify) { # boardname, boardnotifytype , new $num++; my ($selected1, $selected2); if (${$$board_notify{$_}}[1] == 1) { # new topics $selected1 = qq~ selected="selected"~; } else { # all new posts $selected2 = qq~ selected="selected"~; } if (${$$board_notify{$_}}[2]) { $new = qq~$notify_txt{'333'}~; } else { $new = qq~$notify_txt{'334'}~; } ## output notify detail - option 3 = remove notify $boardblock .= qq~ ~; } if (!$num) { # no board notifies up $showNotifications .= qq~ ~; } else { # list boards $showNotifications .= qq~ $boardblock ~; } $showNotifications .= qq~
$notify_txt{'136'} $notify_txt{'136'}
$new ${$$board_notify{$_}}[0]

$notify_txt{'139'}

$notify_txt{'135'} $notify_txt{'138'}
 


~; $num = 0; foreach (keys %$thread_notify) { # mythread, msub, new, username_link, catname_link, boardname_link, lastpostdate $num++; ## build block for display $threadblock .= qq~ ~; } if (!$num) { ## no threads listed $showNotifications .= qq~ ~; } else { ## output details $showNotifications .= qq~ $threadblock ~; } $showNotifications .= qq~
$notify_txt{'118'} $notify_txt{'118'}
${$$thread_notify{$_}}[2] ${$$thread_notify{$_}}[1] $notify_txt{'120'} ${$$thread_notify{$_}}[3]
${$$thread_notify{$_}}[4] » ${$$thread_notify{$_}}[5] - $notify_txt{'lastpost'} ${$$thread_notify{$_}}[6]

$notify_txt{'119'}

$notify_txt{'140'} $notify_txt{'134'}
 
~; $yytitle = "$notify_txt{'124'}"; ## and finally, add jump menu for a route back. if (!$view) { &jumpto; $yymain .= qq~$showNotifications$selecthtml~; &template; } } sub NotificationAlert { my ($myboard, %board_notify, $mythread, %thread_notify); @bmaildir = split(/,/, ${$uid.$username}{'board_notifications'}); @tmaildir = split(/,/, ${$uid.$username}{'thread_notifications'}); # needed for $new - icon (on/off/new.gif) my @noloadboard = grep(!exists ${$uid.$_}{'lastposttime'}, @allboards); &BoardTotals("load",@noloadboard) if @noloadboard; # to get ${$uid.$myboard}{'lastposttime'} &getlog; # sub in Subs.pl, for $yyuserlog{$myboard} my $dmax = $date - ($max_log_days_old * 86400); ## run through boards list foreach $myboard (@bmaildir) { # board name from file name if (!-e "$boardsdir/$myboard.txt") { # remove from user board_notifications &ManageBoardNotify("delete", $myboard, $username); next; } ## load in hash of name / detail for board &ManageBoardNotify("load", $myboard); if (exists $theboard{$username}) { ## grab board name my $boardname = (split(/\|/, $board{$myboard}))[0]; $board_notify{$myboard} = [ $boardname, (split(/\|/, $theboard{$username}))[1], # boardnotifytype (($max_log_days_old && int(${$uid.$myboard}{'lastposttime'}) && ((!$yyuserlog{$myboard} && ${$uid.$myboard}{'lastposttime'} > $dmax) || ($yyuserlog{$myboard} > $dmax && $yyuserlog{$myboard} < ${$uid.$myboard}{'lastposttime'}))) ? 1 : 0), # new == 1 ]; undef %theboard; } } &LoadCensorList if $action eq 'shownotify'; ## load board names unless ($mloaded == 1) { require "$boardsdir/forum.master"; } # for $board{...} foreach $mythread (@tmaildir) { # number of next thread # see if thread exists and search for it if moved if (!-e "$datadir/$mythread.txt") { &ManageThreadNotify("delete", $mythread, $username); eval { require "$datadir/movedthreads.cgi" }; next if !exists $moved_file{$mythread} || !$moved_file{$mythread}; my $newthread; while (exists $moved_file{$mythread}) { $mythread = $moved_file{$mythread}; $newthread = $mythread if !exists $moved_file{$mythread} && -e "$datadir/$mythread.txt"; } next if !$newthread; &ManageThreadNotify("add", $newthread, $username, ${$uid.$username}{'language'}, 1, 1); } ## load threads hash &ManageThreadNotify("load", $mythread); if (exists $thethread{$username}) { ## load ctb file for board data &MessageTotals ("load", $mythread); ## pull out board and last post my $boardid = ${$mythread}{'board'}; my ($msub,$mname,$musername,$new,$username_link,$catname_link,$boardname_link,$lastpostdate); if ($action eq 'shownotify') { unless (${${'notify'.$boardid.$mythread}}[0]) { my ($messageid,$messagesubject); fopen(BOARDTXT, "$boardsdir/$boardid.txt") || &fatal_error("cannot_open","$boardsdir/$boardid.txt", 1); foreach () { ($messageid, $messagesubject, $mname, undef, undef, undef, $musername, undef) = split(/\|/, $_, 8); ${'notify'.$boardid.$messageid} = [$messagesubject,$mname,$musername]; } fclose(BOARDTXT); } $msub = ${${'notify'.$boardid.$mythread}}[0]; $mname = ${${'notify'.$boardid.$mythread}}[1]; $musername = ${${'notify'.$boardid.$mythread}}[2]; &ToChars($msub); ($msub, undef) = &Split_Splice_Move($msub,0); $msub = &Censor($msub); # censor subject text ! ## run through the categories until we hit the match for category name my ($catname,$thiscatid,$catid); my $boardname = (split(/\|/, $board{$boardid}))[0]; # grab boardname from list checkboardname: foreach $catid (@categoryorder) { foreach (split(/\,/, $cat{$catid})) { ## find the match, grab data and jump out if ($_ eq $boardid) { $catname = (split(/\|/, $catinfo{$catid}))[0]; $thiscatid = $catid; last checkboardname; } } } $catname_link = qq~$catname~; $boardname_link = qq~$boardname~; ## build view profile link, if real name exists &LoadUser($musername); # load poster if (${$uid.$musername}{'realname'}) { $username_link = qq~${$uid.$musername}{'realname'}~; } elsif ($mname) { $username_link = $mname; } else { $username_link = $musername; } ## format last post for output $lastpostdate = &timeformat(${$mythread}{'lastpostdate'}); } if ($max_log_days_old) { # Decide if thread should have the "NEW" indicator next to it. # Do this by reading the user's log for last read time on thread, # and compare to the last post time on the thread. my $dlp = int($yyuserlog{$mythread}); my $dlpb = int($yyuserlog{"$boardid--mark"}); $dlp = $dlp > $dlpb ? $dlp : $dlpb; if ($yyuserlog{"$mythread--unread"} || (!$dlp && ${$mythread}{'lastpostdate'} > $dmax) || ($dlp > $dmax && $dlp < ${$mythread}{'lastpostdate'})) { $new = qq~$notify_txt{'335'}~; } } $thread_notify{$mythread} = [$mythread, $msub, $new, $username_link, $catname_link, $boardname_link, $lastpostdate]; } } (\%board_notify,\%thread_notify); } 1;