⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 magicvoicemail.agi.pl

📁 asterisk系统源代码 程序截获SIGHUP信号来保证语音处理部分正常结束。 正常结束,产生MVMSTATUS变量 Main模式: 程序截获SIGHUP信号来保证语音处理部分正常结束。
💻 PL
📖 第 1 页 / 共 2 页
字号:
		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 + -