📄 magicvoicemail.agi.pl
字号:
mkdir($magicvoicemail_conf->{'general'}{'greetfolder'}[0].'/'.$vmid); } while (1) { #录音部分 if (!$acdo) { $AGI->record_file($magicvoicemail_conf->{'general'}{'greetfolder'}[0]."$vmid/$filename",'WAV','#', $timeout,'0',1); chmod oct($magicvoicemail_conf->{'general'}{'filemode'}[0]), $magicvoicemail_conf->{'general'}{'greetfolder'}[0]."$vmid/$filename.WAV"; $acdo=1; } my $sel = &playback('vm-review', '#',undef, 10000, 1); if ($sel eq '1') { &playback('vm-msgsaved'); last; } elsif ($sel eq '2') { $AGI->stream_file($magicvoicemail_conf->{'general'}{'greetfolder'}[0]."$vmid/$filename"); next; } elsif ($sel eq '3') { undef($acdo); next; } }return();}############################################################################################################### Function when callling...#$AGI->record_file(文件名,'WAV',结束按键,超时(百分秒),'0',1,寂静时间(秒));##############################################################################################################sub record_progress{ $AGI->answer();my ($vmid); #获得VMID途径为ARGV[1] if (exists($magicvoicemail_conf->{'users'}{$ARGV[1]})) { $vmid = $ARGV[1]; } else { &playback('vm-mailboxfull'); &done('402'); } #建立用户INBOX目录 umask($magicvoicemail_conf->{'general'}{'dirmask'}[0]); if (!-d$magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$vmid) { mkdir($magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$vmid); } if (!-d$magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$vmid.'/new') { mkdir($magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$vmid.'/new'); } if (!-d$magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$vmid.'/old') { mkdir($magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$vmid.'/old'); } #用户数据解码my $vmdata = &get_vmdata($vmid); #检测该用户MSG 是否FULL if (exists($vmdata->{'maxmsg'})) { &seekfile($magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$vmid); if (($#seek_files+1) >= $vmdata->{'maxmsg'}) { &playback('vm-mailboxfull'); &done('403'); } } #检测该用户DISK 是否FULL if (exists($magicvoicemail_conf->{'general'}{'minspeace'})) { my @df = split(/\n/,`df $magicvoicemail_conf->{'general'}{'vmfolder'}[0]/$vmid`); $df[1] .= ' 'x100; my $template = ''; $template .= 'A' . length($&) while( $df[1] =~ /\S+\s+/g ); my @one_data = unpack( $template, $df[1] ); if ($one_data[3] <= $magicvoicemail_conf->{'general'}{'minspeace'}[0]) { &playback('vm-mailboxfull'); &done('404'); } } #播放提示系统 if (-e$magicvoicemail_conf->{'general'}{'greetfolder'}[0]."$vmid/temp.WAV") { $AGI->stream_file($magicvoicemail_conf->{'general'}{'greetfolder'}[0]."$vmid/temp"); } elsif (-e$magicvoicemail_conf->{'general'}{'greetfolder'}[0]."$vmid/unavail.WAV" && $ARGV[2] eq 'u') { $AGI->stream_file($magicvoicemail_conf->{'general'}{'greetfolder'}[0]."$vmid/unavail"); } elsif (-e$magicvoicemail_conf->{'general'}{'greetfolder'}[0]."$vmid/unavail.WAV" && $ARGV[2] eq 'b') { $AGI->stream_file($magicvoicemail_conf->{'general'}{'greetfolder'}[0]."$vmid/busy"); } elsif ($ARGV[2] eq 'u') { &playback('vm-isunavail',undef,{VMID=>$vmid}); } elsif ($ARGV[2] eq 'b') { &playback('vm-isonphone',undef,{VMID=>$vmid}); } &playback('vm-intro'); #--------------------------------------------------------------------------------------------------- #初始化录音系统 $do_record=0; undef($args); $args = $vmdata; $args->{'extension'} = $input{'extension'}; #extension= $args->{'mailboxid'} = $vmid; #mailboxid= $args->{'context'} = $input{'context'}; #context= $args->{'callerid'} = $input{'calleridname'}.' <'.$input{'callerid'}.'>'; #callerid= $args->{'callerchan'} = $input{'channel'}; #callerchan= $args->{'accountcode'} = $input{'accountcode'}; #accountcode= # timeout if (exists($vmdata->{'maxmessage'})) { $args->{'timeout'}=$vmdata->{'maxmessage'}*1000; } else { $args->{'timeout'}=60000; } # maxsilence if (exists($magicvoicemail_conf->{'general'}{'maxsilence'})) { $args->{'maxsilence'}=$magicvoicemail_conf->{'general'}{'maxsilence'}[0]; } else {$args->{'maxsilence'}=20;} #--------------------------------------------------------------------------------------------------- #开始录音 $do_record=1; $startime=time(); $AGI->record_file('/tmp/'.$vmid.$startime,'WAV','#',$args->{'timeout'},'0',1,$args->{'maxsilence'}); #--------------------------------------------------------------------------------------------------- #开始录音完成 &vm_record_end(); &playback('vm-goodbye');&done('200');}########################################################### VoiceMail Recordsub vm_record_end{ #录音完毕 $do_record=2;my $currtime = time(); #检测留言时间是否太短 if (exists($args->{'minmessage'}) && ($currtime-$startime) <= $args->{'minmessage'}) { unlink('/tmp/'.$args->{'mailboxid'}.$startime.'.WAV'); $do_record=0; &done('405'); } #转存到用户文件夹,并且生成记录信息 system("mv -f /tmp/".$args->{'mailboxid'}.$startime.'.WAV '.$magicvoicemail_conf->{'general'}{'vmfolder'}[0]. '/'.$args->{'mailboxid'}."/new/vm$startime.WAV"); open(TXT,">".$magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$args->{'mailboxid'}."/new/vm$startime.txt"); print TXT ";\n"; print TXT "; Voice Mail Information file\n"; print TXT "; by hoowa sun <hoowa.sun\@gmail.com>\n"; print TXT ";\n"; print TXT "[message]\n"; print TXT "extension=".$args->{'extension'}."\n"; print TXT "mailboxid=".$args->{'mailboxid'}."\n"; print TXT "context=".$args->{'context'}."\n"; print TXT "callerid=".$args->{'callerid'}."\n"; print TXT "callerchan=".$args->{'callerchan'}."\n"; print TXT "accountcode=".$args->{'accountcode'}."\n"; print TXT "time=".$startime."\n"; close(TXT); chmod oct($magicvoicemail_conf->{'general'}{'filemode'}[0]),$magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$args->{'mailboxid'}."/new/vm$startime.WAV"; chmod oct($magicvoicemail_conf->{'general'}{'filemode'}[0]),$magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$args->{'mailboxid'}."/new/vm$startime.txt"; #----------------------------------------------------------------------------------------- #发送电子邮件,删除文件,执行外部程序都交由子进程实现my $child = fork(); if ($child == 0) { #如果用户选择要求发送Email if ($magicvoicemail_conf->{'general'}{'mailcmd'}[0] ne '' && $args->{'email'} ne '') { my ($boundary,$mail_string,$subject,$textbody,$buf,$date,@date); $boundary = 'MagiclinkVM_'.md5_hex(time); $mail_string = "From: ".$magicvoicemail_conf->{'general'}{'mailfrom'}[0]."\n"; $mail_string .= "To: ".$args->{'email'}."\n"; $mail_string .= "Content-type: multipart/mixed; boundary=\"$boundary\"\n"; $subject = $magicvoicemail_conf->{$input{'language'}}{'mailsubject'}[0]; $subject =~ s/\%VMID/$args->{'mailboxid'}/g; $subject =~ s/\%CALLERID/$args->{'callerid'}/g; $mail_string .= "Subject: $subject\n\n"; $mail_string .= "--$boundary\n"; $mail_string .= "Content-type: text/plain; charset=".$magicvoicemail_conf->{$input{'language'}}{'charset'}[0]."\n"; $mail_string .= "Content-transfer-encoding: 8bit\n\n"; $textbody = $magicvoicemail_conf->{$input{'language'}}{'mailbody'}[0]; $textbody =~ s/\%VMID/$args->{'mailboxid'}/g; $textbody =~ s/\%CALLERID/$args->{'callerid'}/g; $textbody =~ s/\%DISPLAYNAME/$args->{'display_name'}/g; $textbody =~ s/\\n/\n/g;$textbody =~ s/\\t/\t/g; $date = localtime($startime); @date = localtime($startime); $date[5] += 1900; $textbody =~ s/\%DATE/$date/g; $textbody =~ s/\%YEAR/$date[5]/g; $textbody =~ s/\%MONTH/$date[4]/g; $textbody =~ s/\%MDAY/$date[3]/g; $textbody =~ s/\%HOUR/$date[2]/g; $textbody =~ s/\%MIN/$date[1]/g; $textbody =~ s/\%SEC/$date[0]/g; $mail_string .= "$textbody\n\n"; $mail_string .= "--$boundary\n"; $mail_string .= "Content-type: audio/x-WAV; name=vm$startime.WAV\n"; $mail_string .= "Content-disposition: inline; filename=vm$startime.WAV\n"; $mail_string .= "Content-Description: Voicemail sound attachment.\n"; $mail_string .= "Content-transfer-encoding: base64\n\n"; open(WAV,$magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$args->{'mailboxid'}."/new/vm$startime.WAV"); while (read(WAV, $buf, 60*57)) { $mail_string .= encode_base64($buf); } close(WAV); $mail_string .= "\n\n"; $mail_string .= "--$boundary--\n"; #发送EMAIL处理 open(MAIL,"|".$magicvoicemail_conf->{'general'}{'mailcmd'}[0]); print MAIL $mail_string; close(MAIL); #只要进入发送许可就检测是否要求delete而不管发送是否成功 if ($args->{'delete'}) { unlink($magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$args->{'mailboxid'}."/new/vm$startime.WAV"); unlink($magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$args->{'mailboxid'}."/new/vm$startime.txt"); } } #如果用户选择要求发送Email #检测是否执行外部程序 if ($magicvoicemail_conf->{'general'}{'externcmd'}[0] ne '') { my $cmd = $magicvoicemail_conf->{'general'}{'externcmd'}[0]; $cmd =~ s/\%VMID/$args->{'mailboxid'}/g; $cmd =~ s/\%CALLERID/$input{'callerid'}/g; $cmd =~ s/\%DISPLAYNAME/$args->{'display_name'}/g; $cmd =~ s/\%MSGID/vm$startime/g; $cmd =~ s/\%ACCOUNTCODE/$args->{'accountcode'}/g; $cmd =~ s/\%EMAIL/$args->{'email'}/g; $cmd =~ s/\%EXTENSION/$args->{'extension'}/g; $cmd =~ s/\%CONTEXT/$args->{'context'}/g; system("$cmd"); } #检测是否执行外部程序 #子进程必须死掉 exit; } #返回父进程状态 $do_record=0;return();}################################################################################################################## Common Function################################################################################################################## get vm data sub get_vmdata{my ($vmid,@data,%vmdata); $vmid = shift; @data = split(/\,/,$magicvoicemail_conf->{'users'}{$vmid}[0]); %vmdata = map { my ($key,$value)=split(/\=/,$_); $key=>$value; } split(/\|/,$data[3]); $vmdata{'password'}=$data[0]; $vmdata{'display_name'}=$data[1]; $vmdata{'email'}=$data[2];return(\%vmdata);}########################################################### Parse key string and playback all of.# sub playback{my ($key,$escape,$args,$timeout,$maxdigits)=@_;my ($response,@file,$i); if (exists($magicvoicemail_conf->{$input{'language'}}{$key})) { @file = split(/\s/,$magicvoicemail_conf->{$input{'language'}}{$key}[0]); } elsif (exists($magicvoicemail_conf->{'en'}{$key})) { @file = split(/\s/,$magicvoicemail_conf->{'en'}{$key}[0]); } else { return(); } for ($i=0;$i<=$#file ;$i++) { if ($file[$i] =~ /^\%DIGITS-(.*)/) { $AGI->say_digits($args->{$1},$escape); } elsif ($#file == $i && $timeout ne '' && $maxdigits ne '') { $response = $AGI->get_data($file[$i],$timeout,$maxdigits); return($response) if ($response ne ''); } elsif ($timeout ne '' && $maxdigits ne '') { $response = $AGI->get_data($file[$i],200,$maxdigits); return($response) if ($response ne ''); } else { $AGI->stream_file($file[$i], $escape); } }return($response);}########################################################### Call do With Donesub done{ $AGI->set_variable('MVMSTATUS', shift); exit;}########################################################### Call do With Exceptionssub exitprog{ #语音处理 if ($do_record == 1) { &vm_record_end(); #如果用户通过#挂机并且又硬Hangup了就会通过exitprog再执行vm_record_end一次。 } elsif ($do_record == 6) { &main_readend($args->{'vmid'}); } # elsif ($do_record == 2) { # unlink('/tmp/'.$args->{'mailboxid'}.$startime.'.WAV'); # unlink($magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$args->{'mailboxid'}."/new/vm$startime.txt"); # unlink($magicvoicemail_conf->{'general'}{'vmfolder'}[0].'/'.$args->{'mailboxid'}."/new/vm$startime.WAV"); # $do_record=0; # exit; #}exit();}########################################################### Seekfilesub seekfile{ my ($dorf)=shift; #如果传递进来的是文件 if (-f $dorf && $dorf =~ /\.WAV/){ push(@seek_files,$dorf); }#如果传递进来的是目录 if (-d $dorf) { opendir(DIR,$dorf); my (@filelist)=readdir(DIR); close(DIR); foreach my $file (@filelist) { if ($file eq '.' or $file eq '..'){} #不处理特殊目录名称 else { &seekfile($dorf.'/'.$file);} #递归搜索这个新发现的结点 } }return();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -