#!/usr/bin/perl -w # # rhrdlibs # # Copyright (C) 2015-2016 Christian Pointner # # This file is part of rhrdlibs. # # rhrdlibs is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # any later version. # # rhrdlibs is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with rhrdlibs. If not, see . # use strict; use RHRD::rddb; use RHRD::utils; use Date::Calc; sub print_usage { print STDERR "Usage: rhrd-pool list\n" . " rhrd-pool show \n" . " rhrd-pool remove|clear [ -f ] \n" . " rhrd-pool add \n" . " rhrd-pool edit <short-name> <title>\n"; } sub list { my ($ctx) = @_; my @pools = RHRD::rddb::list_musicpools($ctx); if(!defined $pools[0] && defined $pools[1]) { print STDERR "$pools[1]: $pools[2]"; return 1; } for my $href (@pools) { print $href->{'SHORTNAME'} . ": " . $href->{'TITLE'} . "\n"; } return 0; } sub show { my ($ctx, $shortname) = @_; my ($pool, $status, $errorstring) = RHRD::rddb::get_musicpool_info($ctx, $shortname); unless (defined $pool) { print STDERR "$errorstring\n"; return 1; } my @carts = RHRD::rddb::get_musicpool_carts_used($ctx, $shortname); if(!defined $carts[0] && defined $carts[1]) { print STDERR "$carts[1]: $carts[2]"; return 1; } my @slots = RHRD::rddb::get_musicpool_clock_usage($ctx, $shortname); if(!defined $slots[0] && defined $slots[1]) { print STDERR "$slots[1]: $slots[2]"; return 1; } print $pool->{'TITLE'} . " (" . $pool->{'SHORTNAME'} . "):\n"; print " group: " . $pool->{'GROUP'} . ", carts: " . $pool->{'LOW_CART'} . "-" . $pool->{'HIGH_CART'} . " (" . scalar(@carts) . " used)\n"; print " clock usage:"; my $current_dow = -1; my $first = 0; for my $slot (@slots) { if($slot->{'DOW'} != $current_dow) { $current_dow = $slot->{'DOW'}; print "\n " . Date::Calc::Day_of_Week_to_Text(($slot->{'DOW'} == 0) ? 7 : $slot->{'DOW'}) . ":\t"; $first = 1; } print ", " unless($first); $first = 0; print sprintf("%02d:00", $slot->{'HOUR'}) } print "\n"; return 0; } sub add__check_arguments { my ($groupname, $title) = @_; if($groupname !~ m/^[-a-zA-Z0-9_]{1,10}$/) { print STDERR "name '" . $groupname . "' contains illegal characters or is too long/short\n"; print STDERR " only a-z, A-Z, 0-9 and _,- are allowed and the length must be between 1 and 10\n"; return 1; } return 0; } sub add { my ($ctx, $groupname, $title) = @_; my ($ret) = add__check_arguments($groupname, $title); if($ret) { return $ret; } print " * creating pool: '" . $title . "' with group '" . $groupname . "'\n"; my ($result, $status, $errorstring) = RHRD::rddb::check_group($ctx, $groupname); unless(defined $result) { print STDERR $status . ": " . $errorstring . "\n"; return 1; } if($result) { print STDERR "group " . $groupname . " already exists!\n"; return 1 } (my $num, $status, $errorstring) = RHRD::rddb::create_musicpool_group($ctx, $groupname, $title); unless(defined $num) { print STDERR $status . ": " . $errorstring . "\n"; return 1; } my $shortname = sprintf("P%02d", $num); my $color = RHRD::utils::get_musicpool_color($num); print " * created group '" . $groupname . "' --> pool shortname / color: " . $shortname . " / " . $color . "\n"; ($result, $status, $errorstring) = RHRD::rddb::create_musicpool_event($ctx, $shortname, $groupname, $color); unless(defined $result) { print STDERR $status . ": " . $errorstring . "\n"; return 1; } print " * created event\n"; ($result, $status, $errorstring) = RHRD::rddb::create_musicpool_clock($ctx, $shortname, $color); unless(defined $result) { print STDERR $status . ": " . $errorstring . "\n"; return 1; } print " * created clock\n"; ($result, $status, $errorstring) = RHRD::rddb::create_musicpool_dropbox($ctx, $groupname, $shortname); unless(defined $result) { print STDERR $status . ": " . $errorstring . "\n"; return 1; } print " * created dropbox for pool .. " . $result . " rows affected\n"; print " * finished\n"; return 0; } sub edit { my ($ctx, $shortname, $title) = @_; my ($result, $status, $errorstring) = RHRD::rddb::update_musicpool_title($ctx, $shortname, $title); unless(defined $result) { print STDERR $status . ": " . $errorstring . "\n"; return 1; } if ($result != 1) { print "pool '" . $shortname ."' does not exist.\n"; return 1; } print "pool '" . $shortname . "' successfully changed!\n"; return 0; } sub remove { my ($ctx, $shortname, $force) = @_; my ($pool, $status, $errorstring) = RHRD::rddb::get_musicpool_info($ctx, $shortname); unless(defined $pool) { print STDERR $status . ": " . $errorstring . "\n"; return 1; } my $title = $pool->{'TITLE'} . " (" . $pool->{'SHORTNAME'} . ")"; if(!$force) { return 1 if(!RHRD::utils::cmdline_ask_yn("do you really want to delete pool '$title'")); print("\n"); } my @slots = RHRD::rddb::get_musicpool_clock_usage($ctx, $shortname); if(!defined $slots[0] && defined $slots[1]) { print STDERR "$slots[1]: $slots[2]"; return 1; } if(scalar(@slots) > 0) { print STDERR "musicpool is still in use (" . scalar(@slots) . " grid entries)\n"; return 1 unless($force); print STDERR " *** forced removal ***\n" } print("removing pool: $title\n"); my @results = RHRD::rddb::remove_musicpool($ctx, $shortname); if(!defined $results[0] && defined $results[2]) { print STDERR $results[1] . ": " . $results[2] . "\n"; return 1; } for my $href (@results) { print int($href->{cnt}) . " " . $href->{name} . " deleted\n"; } return 0; } sub clear { my ($ctx, $shortname, $force) = @_; my ($pool, $status, $errorstring) = RHRD::rddb::get_musicpool_info($ctx, $shortname); unless(defined $pool) { print STDERR $status . ": " . $errorstring . "\n"; return 1; } my $title = $pool->{'TITLE'} . " (" . $pool->{'SHORTNAME'} . ")"; if(!$force) { return 1 if(!RHRD::utils::cmdline_ask_yn("do you really want to clear pool '$title'")); print("\n"); } my @slots = RHRD::rddb::get_musicpool_clock_usage($ctx, $shortname); if(!defined $slots[0] && defined $slots[1]) { print STDERR "$slots[1]: $slots[2]"; return 1; } if(scalar(@slots) > 0) { print STDERR "musicpool is still in use (" . scalar(@slots) . " grid entries)\n"; return 1 unless($force); print STDERR " *** forced clearing ***\n" } print("clearing pool: $title\n"); my @results = RHRD::rddb::clear_musicpool($ctx, $shortname); if(!defined $results[0] && defined $results[2]) { print STDERR $results[1] . ": " . $results[2] . "\n"; return 1; } for my $href (@results) { print int($href->{cnt}) . " " . $href->{name} . " deleted\n"; } return 0; } my $num_args = $#ARGV + 1; if($num_args < 1) { print_usage(); exit(1); } my $cmd = $ARGV[0]; my $ret = 0; my ($ctx, $status, $errorstring) = RHRD::rddb::init(); if(defined $ctx) { if($cmd eq "list") { if($num_args > 1) { print_usage(); $ret = 1; } else { $ret = list($ctx) } } elsif($cmd eq "show") { if($num_args != 2) { print_usage(); $ret = 1; } else { $ret = show($ctx, $ARGV[1]) } } elsif($cmd eq "remove") { if($num_args < 2 || $num_args > 3) { print_usage(); $ret = 1; } else { if($num_args == 3) { if($ARGV[1] ne '-f') { print_usage(); $ret = 1; } else { $ret = remove($ctx, $ARGV[2], 1); } } else { $ret = remove($ctx, $ARGV[1], 0); } } } elsif($cmd eq "clear") { if($num_args < 2 || $num_args > 3) { print_usage(); $ret = 1; } else { if($num_args == 3) { if($ARGV[1] ne '-f') { print_usage(); $ret = 1; } else { $ret = clear($ctx, $ARGV[2], 1); } } else { $ret = clear($ctx, $ARGV[1], 0); } } } elsif($cmd eq "add") { if($num_args != 3) { print_usage(); $ret = 1; } else { $ret = add($ctx, $ARGV[1], $ARGV[2]); } } elsif($cmd eq "edit") { if($num_args != 3) { print_usage(); $ret = 1; } else { $ret = edit($ctx, $ARGV[1], $ARGV[2]); } } else { print_usage(); $ret = 1; } RHRD::rddb::destroy($ctx); } else { print STDERR "$errorstring\n"; $ret = 1; } exit $ret;