📄 magicvoicemail.agi.pl
字号:
#!/opt/perl/bin/perl#-----------------------------------------------------------------------------------# MagicVoicemail## Copyright by hoowa.sun <hoowa.sun@gmail.com># Dalian Baihe Mulitmedia Co.,Ltd.## This Program public under miniAsterisk.org Projects.## This program distributed under the terms of the GNU General Public License(GPL).# See the LICENSE file at the top of the source tree.## 1.0 by hoowa.sun 2007-3-9#------------------------------------------------------------------------------------# Record#exten => number,1,AGI(MagicVoiceMail|record|[Voicemail_number]|u/b)# Main#exten => number,1,AGI(MagicVoiceMail|main|[Voicemail_number])#use FindBin qw($Bin);use Asterisk::AGI;use Asterisk::config;use MIME::Base64 qw(encode_base64);use Digest::MD5 qw(md5_hex);use strict;$|=1;# VERSIONmy $VERSION='1.0';if ($ARGV[0] eq '--version') { print "$VERSION\n";exit;}my $CONF = "$Bin/../../../etc/magicvoicemail.conf";# START AGImy $AGI = new Asterisk::AGI;my %input = $AGI->ReadParse();# Asterisk::configmy ($rc,$magicvoicemail_conf);$rc = new Asterisk::config;&done('400') if (!eval{($magicvoicemail_conf) = $rc->load_config(filename=>$CONF)});&done('401') if (!-d$magicvoicemail_conf->{'general'}{'greetfolder'}[0]);&done('401') if (!-d$magicvoicemail_conf->{'general'}{'vmfolder'}[0]);# GLOBALS FOR MEmy ($args,$do_record,$startime,@seek_files);$SIG{HUP} = sub {&exitprog()};# Default language$input{'language'} = 'en' if (!exists($magicvoicemail_conf->{$input{'language'}}));# START CHECKif ($ARGV[0] eq 'main') {&main_progress;}else {&record_progress;}exit(0);############################################################################################################### Function with main mode#$AGI->record_file(文件名,'WAV',结束按键,超时(百分秒),'0',1,寂静时间(秒));##############################################################################################################sub main_progress{my ($max_jump,$action,$act_args);$max_jump=1;$AGI->answer(); #流程循环系统 while ($max_jump <= 30) { $max_jump++; #---------------------------------------------------个人设置 1.0 #ARGS: VMID if ($action eq '1.0') { my ($sel,$myargs); undef($action); $myargs = $act_args; undef($act_args); $sel = &playback('vm-options', '#',undef,10000, 1); #------------------------------------选择录u b n if ($sel eq '1' || $sel eq '2' || $sel eq '3') { my ($filename); #分析filename if ($sel eq '1') { &playback('vm-rec-unv');$filename='unavail';} elsif ($sel eq '2') { &playback('vm-rec-busy');$filename='busy';} elsif ($sel eq '3') { &playback('vm-rec-name');$filename='greet';} else {last;} #录音 &vm_uo_record($myargs->{'vmid'},$filename); #返回1.0 sleep(1); $action='1.0'; $act_args->{'vmid'}=$myargs->{'vmid'}; next; #------------------------------------选择录t } elsif ($sel eq '4') { my $temp = &playback('vm-tempgreeting2','#',undef, 10000, 1); if ($temp eq '1') { &playback('vm-rec-temp'); &vm_uo_record($myargs->{'vmid'},'temp'); } else { unlink($magicvoicemail_conf->{'general'}{'greetfolder'}[0].'/'.$myargs->{'vmid'}."/temp.WAV"); &playback('vm-tempremoved'); } #返回1.0 sleep(1); $action='1.0'; $act_args->{'vmid'}=$myargs->{'vmid'}; next; #------------------------------------选择改密码 } elsif ($sel eq '5') { my ($newpass,$repass,$itsok); while (!$itsok) { $newpass = &playback('vm-newpassword','#',undef, 10000, 12); $repass = &playback('vm-reenterpassword','#',undef, 10000, 12); #密码不对 if ($newpass ne $repass || $newpass eq '') {&playback('vm-mismatch');next;} else {$itsok=1;} } #修改密码 my $value = $magicvoicemail_conf->{'users'}{$myargs->{'vmid'}}[0]; $value =~ s/^(.+?)\,//; $value = "$newpass,$value"; $rc->clean_assign(); $rc->assign_editkey(section=>'users',key=>$myargs->{'vmid'},new_value=>$value); $rc->save_file(filename=>$CONF); #修改完成返回1.0 &playback('vm-passchanged'); sleep(1); $action='1.0'; $act_args->{'vmid'}=$myargs->{'vmid'}; next; #------------------------------------选择返回主菜单 } elsif ($sel eq '*') { sleep(1); $action='1.B'; $act_args->{'vmid'}=$myargs->{'vmid'}; next; #------------------------------------再执行一次本程序 } else { sleep(1); $action='1.0'; $act_args->{'vmid'}=$myargs->{'vmid'}; next; } #---------------------------------------------------阅读留言 1.1 #ARGS: vmid folder [filename] } elsif ($action eq '1.1') { my ($sel,$myargs); undef($action); $myargs = $act_args; undef($act_args); #记录状态进入读消息状态 undef($do_record); undef($args); $do_record=6; $args->{'vmid'}=$myargs->{'vmid'}; #获得文件 $myargs->{'folder'}='new' if ($myargs->{'folder'} eq ''); undef(@seek_files); &seekfile($magicvoicemail_conf->{'general'}{'vmfolder'}[0]."/".$myargs->{'vmid'}."/". $myargs->{'folder'}."/"); @seek_files = sort {$a cmp $b} @seek_files; next if ($#seek_files < 0); #语音处理 my ($filename,$info,$calleridnum,$nextdo,$i); #找出filename for ($i=0;$i<=$#seek_files ;$i++) { next if ($myargs->{'filename'} ne '' && $seek_files[$i] ne $myargs->{'filename'}); $filename = $seek_files[$i]; last; } #解码&播放 $filename =~ s/\.WAV//; ($info) = $rc->load_config(filename=>$filename.'.txt'); $calleridnum = $info->{'message'}{'callerid'}[0]; $calleridnum=~/\<(.+?)\>/; $calleridnum=$1; if ($i == 0) {&playback('vm-first',undef,{CALLERIDNUM=>$calleridnum});} elsif ($i == $#seek_files) { &playback('vm-last',undef,{CALLERIDNUM=>$calleridnum}); } else { &playback('vm-numbermsg',undef,{CALLERIDNUM=>$calleridnum,NUMBER=>($i+1)}); } $AGI->stream_file($filename); #选择 while (1) { $sel = &playback('vm-playbackopts','#',undef,10000,1); if ($sel eq '' || $sel eq '#') { $nextdo='#';last; }#退出 elsif ($sel eq '*') { next;}#重复 elsif ($sel eq '4') { $nextdo='4';last; }#退出 elsif ($sel eq '5') { $nextdo='5';last; }#退出 elsif ($sel eq '6') { $nextdo='6';last; }#退出 elsif ($sel eq '7') { $nextdo='7';last; }#退出 } if ($nextdo eq '4' || $nextdo eq '5' || $nextdo eq '6' || $nextdo eq '7') { #选择4播放上一条:如果当前是第一条 if ($nextdo eq '4' && $i == 0) { $act_args->{'folder'}=$myargs->{'folder'}; $act_args->{'filename'}=$seek_files[$i]; #选择4播放上一条: } elsif ($nextdo eq '4') { $act_args->{'folder'}=$myargs->{'folder'}; $act_args->{'filename'}=$seek_files[$i-1]; #选择5重复播放 } elsif ($nextdo eq '5') { $act_args->{'folder'}=$myargs->{'folder'}; $act_args->{'filename'}=$seek_files[$i]; #选择6播放下一条 } elsif ($nextdo eq '6' && $i < $#seek_files) { $act_args->{'folder'}=$myargs->{'folder'}; $act_args->{'filename'}=$seek_files[$i+1]; #选择6播放下一条:如果当前既是最后一条 } elsif ($nextdo eq '6') { &playback('vm-nomore'); &main_readend($myargs->{'vmid'}); #选择7删除消息 } elsif ($nextdo eq '7' && $i < $#seek_files) { unlink("$filename.txt"); unlink("$filename.WAV"); &playback('vm-deleted'); $act_args->{'folder'}=$myargs->{'folder'}; $act_args->{'filename'}=$seek_files[$i+1]; #选择7删除消息:如果当前是最后一条 } elsif ($nextdo eq '7') { unlink("$filename.txt"); unlink("$filename.WAV"); &playback('vm-deleted'); sleep(1); &playback('vm-nomore'); &main_readend($myargs->{'vmid'}); } $action='1.1'; $act_args->{'vmid'}=$myargs->{'vmid'}; #选择#的时候 } else { &main_readend($myargs->{'vmid'}); } next; #---------------------------------------------------阅读留言 1.2 #ARGS: vmid } elsif ($action eq '1.2') { my ($sel,$myargs); undef($action); $myargs = $act_args; undef($act_args); $sel = &playback('vm-changeto','#',{NEW=>'0',OLD=>'1'},10000,1); if ($sel eq '0') { $action='1.1'; $act_args->{'vmid'}=$myargs->{'vmid'}; $act_args->{'folder'}='new';next; } elsif ($sel eq '1') { $action='1.1'; $act_args->{'vmid'}=$myargs->{'vmid'}; $act_args->{'folder'}='old';next; } elsif ($sel eq '') { $action='1.2'; $act_args->{'vmid'}=$myargs->{'vmid'}; next; } else { $action='1.B'; $act_args->{'vmid'}=$myargs->{'vmid'}; next; } #---------------------------------------------------主菜单系统 1.B #ARGS: VMID } elsif ($action eq '1.B') { my ($sel,$myargs); undef($action); $myargs = $act_args; undef($act_args); #选择 $sel = &playback('vm-opts','#',undef,10000,1); if ($sel eq '0') { $action='1.0'; $act_args->{'vmid'}=$myargs->{'vmid'}; next; } elsif ($sel eq '1') { $action='1.1'; $act_args->{'vmid'}=$myargs->{'vmid'}; $act_args->{'folder'}='new';next; } elsif ($sel eq '2') { $action='1.2'; $act_args->{'vmid'}=$myargs->{'vmid'}; next; } elsif ($sel eq '3') { } elsif ($sel eq '' ||$sel eq '#' ) { last; } else { $action='1.B'; $act_args->{'vmid'}=$myargs->{'vmid'}; next; } #---------------------------------------------------登陆系统 1.A #ARGS: } else { my ($vmid,$vmpass,$vmdata); undef($action); undef($act_args); sleep(1); #用户填写VMID if (!exists($magicvoicemail_conf->{'users'}{$ARGV[1]})) { $vmid = &playback('vm-login', '#',undef,10000, 12); } else { $vmid = $ARGV[1]; } #检测是否填写VMID &done('406') if ($vmid eq ''); #检测用户是否存在 next if (!exists($magicvoicemail_conf->{'users'}{$vmid})); #解码数据 $vmdata = &get_vmdata($vmid); if ($vmdata->{'password'} ne '') { #用户填写VMPASS $vmpass = &playback('vm-password','#',undef,10000, 12); #检测密码是否正确 if ($vmdata->{'password'} ne $vmpass) { &playback('vm-incorrect'); next; } } #进入后 undef(@seek_files); &seekfile($magicvoicemail_conf->{'general'}{'vmfolder'}[0]."/$vmid/new/"); if ($#seek_files < 0) { &playback('vm-youhaveno'); } else { &playback('vm-youhave',undef,{NEWCOUNT=>($#seek_files+1)}); } $action='1.B'; $act_args->{'vmid'}=$vmid; next; } }&done('201');}########################################################### User read endsub main_readend{my $vmid = shift; undef(@seek_files); &seekfile($magicvoicemail_conf->{'general'}{'vmfolder'}[0]."/$vmid/new/"); foreach (@seek_files) { my $filename = $_; $filename =~ s/\.WAV//; system("mv -f $filename.WAV ".$magicvoicemail_conf->{'general'}{'vmfolder'}[0]."/$vmid/old/"); system("mv -f $filename.txt ".$magicvoicemail_conf->{'general'}{'vmfolder'}[0]."/$vmid/old/"); }return();}########################################################### User Opts Record sub vm_uo_record{my $vmid = shift;my $filename = shift;my ($vmdata,$timeout,$acdo); $vmdata = &get_vmdata($vmid); #用户数据解码 if (exists($vmdata->{'maxgreet'})) { $timeout=$vmdata->{'maxgreet'}*1000; } else { $timeout=30000; } #建立用户greet目录 umask($magicvoicemail_conf->{'general'}{'dirmask'}[0]); if (!-d$magicvoicemail_conf->{'general'}{'greetfolder'}[0].'/'.$vmid) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -