#! /usr/bin/perl ################################################################################ # # # adm.cgi # # ------- # # INDIW-2000 / Futurama-prosjektet # # # ################################################################################ # # # This file is © Arne Sommer - rev. 11. May 2000. # # # ################################################################################ use FindBin; use lib "$FindBin::Bin/mylib"; # Get the directory where the program resides, and add the 'mylib' # # subdirectory to the library lookup table. # use CGI; require "lib/indifu.pl"; ## Language Specific ########################################################### my($lang) = language(); # Get the user's prefered language. # ################################################################################ error_doc($lang) unless connect_db(); # Die gracefully if the database failed to respond. # ##!! Avsluttende tekst er IKKE støttet i koden. ################################################################################ $q = new CGI; my($header, $user_id) = cookie_header($q); # Set up (parse and maintain) the cookie. # print $header; ## The rest of the document #################################################### my($story_id) = $q->url_param("story_id"); my($part_no) = $q->url_param('part_no'); my($alt_no) = $q->url_param('alt_no'); my($action) = $q->url_param("mode"); my($rules) = $q->param("rules"); $action = "write" if defined $rules; my($exists, $name, $owner, $status, $parts, $limit) = get_status($story_id); @links = (); print start_doc($q, "indifu $a_title{$lang} '$name'"); print $q->h2("$a_title{$lang} '$name'"), "\n"; unless ($exists) { print "$a_n_sto{$lang}", $q->p; &finish; } unless ($owner eq $user_id) # Owner only. # { box_text($a_n_own{$lang}, "#FF0000"); &finish; } if ($action and $status) # $status, as we should not mess with a finished story. # { ## Incoming Votes ############################################################## if ($action eq "set" or $action eq "clear") { my($mode) = $action eq "set" ? 1 : 0; # print "UID: $user_id, HID: $story_id, PNO:$part_no, ANO:$alt_no, M:$mode\n", $q->p; set_alt_status($user_id, $story_id, $parts + 1, $alt_no, $mode) ? box_text($v_stat{$lang}, "#00FF00") : box_text($v_nstat{$lang}, "#FF0000"); print $q->p, separator_line(), $q->p; } elsif ($action eq "stop") { if ($status == 1) # Writing mode. # { stop_write($user_id, $story_id) ? box_text($a_stow{$lang}, "#FFFF00") : box_text($a_nstow{$lang}, "#FF0000"); } elsif ($status == 2) # Voting mode. # { my($ret, $cnt) = stop_vote($user_id, $story_id, $parts +1); if ($ret == 0) { box_text($a_nstov{$lang}, "#FF0000"); } # (0,x) elsif ($cnt == 0) { box_text($a_stov{$lang}, "#FFFF00"); } # (1,0) else { box_text($a_stov2{$lang}, "#FFFF00"); # (1,1->) print show_part($story_id, $parts + 1, 1, $cnt); } } } elsif ($action eq "finish") { if ($status == 3) # Stopped/halted. # { stop_story($user_id, $story_id) ##!! No comment support p.t. # ? box_text($a_fin{$lang}, "#FFFF00") : box_text($a_nfin{$lang}, "#FF0000"); } } elsif ($action eq "write") { if ($status == 3) # Stopped/halted. # { if ($rules) # Any part rules? # { set_part_rules($user_id, $story_id, $parts + 1, $rules) ? box_text($a_paru{$lang}, "#FFFF00") : box_text($a_nparu{$lang}, "#FF0000"); } start_write($user_id, $story_id) ? box_text($a_opew{$lang}, "#FFFF00") : box_text($a_nopew{$lang}, "#FF0000"); } } elsif ($action eq "vote") { if ($status == 3) # Stopped/halted. # { start_vote($user_id, $story_id, $parts +1) ? box_text($a_opev{$lang}, "#FFFF00") : box_text($a_nopev{$lang}, "#FF0000"); ##!! Must set up the alt_no's for voting! } } ## Stop Writing, and start voting. ########################################### elsif ($action eq "stop_vote") { if ($status == 1) # Writing mode. # { my($ok) = stop_write($user_id, $story_id); $ok ? box_text($a_stow{$lang}, "#FFFF00") : box_text($a_nstow{$lang}, "#FF0000"); if ($ok) { start_vote($user_id, $story_id, $parts +1) ? box_text($a_opev{$lang}, "#FFFF00") : box_text($a_nopev{$lang}, "#FF0000"); } } } ## Stop Voting, and start writing. ########################################### elsif ($action eq "stop_write") { if ($status == 2) # Voting mode. # { my($ret, $cnt) = stop_vote($user_id, $story_id, $parts +1); if ($ret == 0) { box_text($a_nstov{$lang}, "#FF0000"); } # (0,x) elsif ($cnt == 0) { box_text($a_stov{$lang}, "#FFFF00"); } # (1,0) else { box_text($a_stov2{$lang}, "#FFFF00"); # (1,1->) print show_part($story_id, $parts + 1, 1, $cnt); start_write($user_id, $story_id, $parts +1) ? box_text($a_opew{$lang}, "#FFFF00") : box_text($a_nopew{$lang}, "#FF0000"); } } } ## Stop Voting, and finish the story. ######################################## elsif ($action eq "stop_finish") { if ($status == 2) # Voting mode. # { my($ret, $cnt) = stop_vote($user_id, $story_id, $parts +1); if ($ret == 0) { box_text($a_nstov{$lang}, "#FF0000"); } # (0,x) elsif ($cnt == 0) { box_text($a_stov{$lang}, "#FFFF00"); } # (1,0) else { box_text($a_stov2{$lang}, "#FFFF00"); # (1,1->) print show_part($story_id, $parts + 1, 1, $cnt); stop_story($user_id, $story_id) ? box_text($a_fin{$lang}, "#FFFF00") : box_text($a_nfin{$lang}, "#FF0000"); } } } ############################################################################## print $q->p; ($exists, $name, $owner, $status, $parts, $limit) = get_status($story_id); # So that we we are told if the story has gotten longer. # # And to get hold of the state. # } ################################################################################ my(@actions); if ($status == 0) # Terminated/finished story. # { box_text($a_term{$lang}, "#FF0000"); finish(); } elsif ($status == 1) # Writing mode. # { my($part_no) = $parts + 1; # The part after the official story. # my(@parts) = get_parts($story_id, $part_no); my($parts) = scalar(@parts)/2; box_text($a_write{$lang} . " ". $a_with{$lang} . " $parts " . $a_sug{$lang}, "#DDDDDD"); push(@actions, $q->a({-href=>"adm.cgi?story_id=$story_id&mode=stop"}, $a_swrit{$lang})); push(@actions, $q->a({-href=>"adm.cgi?story_id=$story_id&mode=stop_vote"}, $a_swrsv{$lang})) if $parts; } elsif ($status == 2) # Voting mode. # { ## Show the registered votes in the system. # my($a, $sum, @votes) = show_vote($story_id, $parts + 1); box_text("$a_vote{$lang}", "#DDDDDD", "$sum $a_novot{$lang}", "#DDDDDD"); box_text($a_vot_w{$lang}, "#FFFF00") if $sum; # Warn that a winner is chosen if the voting is stopped. # push(@actions, $q->a({-href=>"adm.cgi?story_id=$story_id&mode=stop"}, $a_svote{$lang})); if ($sum) { push(@actions, $q->a({-href=>"adm.cgi?story_id=$story_id&mode=stop_write"}, $a_sv_sw{$lang}), $q->a({-href=>"adm.cgi?story_id=$story_id&mode=stop_finish"}, $a_sv_fi{$lang})); print $q->p, $a_use1{$lang} . $q->a({-href=>"adm.cgi?story_id=$story_id&mode=stop"}, $a_svote{$lang}) . $a_use2{$lang}; } } elsif ($status == 3) # Stopped/halted. # { box_text($a_susp{$lang}, "#DDDDDD"); # push(@actions, # $q->a({-href=>"adm.cgi?story_id=$story_id&mode=write"}, $a_st_wr{$lang})); anything_to_vote_on($story_id, $parts + 1) ? push(@actions, $q->a({-href=>"adm.cgi?story_id=$story_id&mode=vote"}, $a_st_vo{$lang})) : push(@actions, $a_st_vo{$lang}); push(@actions, $q->a({-href=>"adm.cgi?story_id=$story_id&mode=finish"}, $a_stop{$lang})); my($body) = get_rules($story_id, $parts + 1, 0) || ""; ##!! print $q->start_multipart_form, $a_parul{$lang}, $q->textarea(-name => 'rules', -default => $body, -override => 1, -rows => 5, -columns => 80), $q->br, $q->defaults('Clear'), $q->br, $q->submit(undef, $a_st_wr{$lang}), " | "; if (@actions) { print_links3(@actions); @actions = (); } print $q->endform; } ################################################################################ if (@actions) { print_links2(@actions); @actions = (); } ## Finished #################################################################### do_show_alt() unless $status == 2; # Show all the alternatives, so that we can toggle more of them. # # But not in voting mode. # finish(); ################################################################################ sub show_part { my($stat, $text, $owner, $date) = get_story_alt(@_); my(@out); return unless $stat; push(@out, $text, $q->p); push(@out, $q->em("[$owner, $date]")) if $show_owner{'adm'}; push(@out, $q->hr); return ($text, $q->p, $q->em("[$owner, $date]"), $q->hr); } ################### Do Show Alt ################################################ # # # What: Show the alternatives for this part of the story. # # In: None. # # Out: None. # # # ################################################################################ sub do_show_alt { my($part_no) = $parts + 1; my(@parts) = get_parts($story_id, $part_no); # The part after the official story. # if (@parts) { print $q->h3($a_sug2{$lang}), $q->a({-href=>"adm.cgi?story_id=$story_id\&part_no=$part_no\&alt_no=0\&mode=clear"}, $v_nackA{$lang}), " | ", $q->a({-href=>"adm.cgi?story_id=$story_id\&part_no=$part_no\&alt_no=0\&mode=set"}, $v_ackA{$lang}), $q->hr; my($alt_no, $alt_stat); do { $alt_no = shift(@parts); $alt_stat = shift(@parts); &vote_part($story_id, $part_no, $alt_no, $alt_stat); } while (@parts); } else { box_text($v_novo1{$lang}, "#FF0000"); } } ################### Vote Part ################################################## # # # What: Show an alternative with a voting/adm. link. # # In1: The story id. # # In2: The part number. # # In3: The alternative number. # # In4: A status code; 0 - Not for voting, 1 - OK for voting. # # In5: The mode; 0 - Owner/editor, 1 - Voting mode. # # Out: None. # # # ################################################################################ sub vote_part { my($story_id) = shift; my($part_no) = shift; my($alt_no) = shift; my($alt_stat) = shift; my($ok, $text, $owner, $date) = get_story_alt($story_id, $part_no, 1, $alt_no); return unless $ok; print $text, $q->p, $q->em("[$owner, $date]"); ## ##################################################################### if ($alt_stat) { box_text($v_ack{$lang}, "#00FF00", $q->a({-href=>"adm.cgi?story_id=$story_id\&part_no=$part_no\&alt_no=$alt_no\&mode=clear"}, $v_dnack{$lang}), undef); } else { box_text($v_nack{$lang}, "#FF0000", $q->a({-href=>"adm.cgi?story_id=$story_id\&part_no=$part_no\&alt_no=$alt_no\&mode=set"}, $v_dack{$lang}), undef); } print $q->hr; } ## Finished #################################################################### sub finish { push(@links, $q->a({-href=>"index.cgi"}, $i_main{$lang})); push(@links, $q->a({-href=>"story.cgi?story_id=$story_id"}, $a_story{$lang})); push(@links, $q->a({-href=>"adm.cgi?story_id=$story_id"}, $i_adm{$lang})); push(@links, $q->a({-href=>"help.cgi?help=logout"}, $i_logou{$lang})); push(@links, $q->a({-href=>"help.cgi?help=adm"}, $i_help{$lang})); print_links(); print bottom_line(), $q->end_html(); disconnect_db(); exit; } ################################################################################