[Asterisk-Users] New app: app_privacy

Mike Reiling miker at mac.com
Wed Feb 19 16:21:07 MST 2003


This was just a quick hack to keep the telemarketer calls down.  If a 
call comes in, and there is no callerid, then it answers the channel 
and requests their 10 digit phone number.  If they enter ten digits, 
then it sets the callerid to that number and lets the call go on.  If 
they enter bad numbers 3 times, then the app changes the priority to 
n+101.

Its not quite a fancy as some of the other things we discussed, but it 
does the job.

Only one problem.  It needs voice prompts recorded, and my voice would 
likely scare them away.  Mark, can we work together to get 3 files 
recorded?

Here is the app, but remember, you need to record your prompts for now. 
  They should be something like the following.

privacy-prompt.gsm:  This number does not accept calls with callerid 
blocked.  Please enter your area code and phone number.

privacy-incorrect.gsm:  I'm sorry, that number is not valid.  Please 
enter you 10 digit phone number, starting with the area code.

privacy-thankyou.gsm:  Thank you.  Please hold while I transfer you 
call.

--Mike
-------------- next part --------------
/*
 * Asterisk -- A telephony toolkit for Linux.
 *
 * Block all calls without Caller*ID, require phone # to be entered
 * 
 * Copyright (C) 1999, Mark Spencer
 *
 * Mark Spencer <markster at linux-support.net>
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License
 */

#include <asterisk/lock.h>
#include <asterisk/file.h>
#include <asterisk/logger.h>
#include <asterisk/options.h>
#include <asterisk/channel.h>
#include <asterisk/pbx.h>
#include <asterisk/module.h>
#include <asterisk/translate.h>
#include <asterisk/image.h>
#include <asterisk/callerid.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>

static char *tdesc = "Require phone number to be entered, if no CallerID sent";

static char *app = "PrivacyManager";

static char *synopsis = "Require phone number to be entered, if no CallerID sent";

static char *descrip =
  "  PrivacyManager: If no Caller*ID is sent, PrivacyManager answers the\n"
  "channel and asks the caller to enter their 10 digit phone number.\n"
  "The caller is given 3 attempts.  If after 3 attempts, they do no enter\n"
  "their 10 digit phone number, and if there exists a priority n + 101,\n"
  "where 'n' is the priority of the current instance, then  the\n"
  "channel  will  be  setup  to continue at that priority level.\n"
  "Otherwise, it returns 0.  Does nothing if Caller*ID was received on the\n"
  "channel.\n";

STANDARD_LOCAL_USER;

LOCAL_USER_DECL;

static int
privacy_exec (struct ast_channel *chan, void *data)
{
	int res=0;
	int retries;
	char phone[10];
	char new_cid[144];
	struct localuser *u;
	char *prompt;

	LOCAL_USER_ADD (u);
	if (chan->callerid)
	{
		if (option_verbose > 2)
			ast_verbose (VERBOSE_PREFIX_3 "CallerID Present: Skipping");
	}
	else
	{
		/*Answer the channel if it is not already*/
		if (chan->_state != AST_STATE_UP) {
			res = ast_answer(chan);
			if (res) {
				LOCAL_USER_REMOVE(u);
				return -1;
			}
		}

		/*Ask for 10 digit number, give 3 attempts*/
		prompt = "privacy-prompt";
		for (retries = 0; retries < 3; retries++) {
			res = ast_app_getdata(chan, prompt, phone, sizeof(phone), 0);
			if (res < 0)
				break;
			res = 0;

			/*Make sure we get 10 digits*/
			if (strlen(phone) == 10) 
				break;
			else
				prompt="privacy-incorrect";
		}
		
		if ((retries < 3) && !res) {
			res = ast_streamfile(chan, "privacy-thankyou", chan->language);
			if (!res)
				res = ast_waitstream(chan, "");
			snprintf (new_cid, sizeof (new_cid), "\"%s\" <%s>", "Privacy Manager", phone);
			ast_set_callerid (chan, new_cid, 0);
			if (option_verbose > 2)
				ast_verbose (VERBOSE_PREFIX_3 "Changed Caller*ID to %s\n",new_cid);
		} else {
			/*Send the call to n+101 priority, where n is the current priority*/
			if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
				chan->priority+=100;
		}
	}

  LOCAL_USER_REMOVE (u);
  return 0;
}

int
unload_module (void)
{
  STANDARD_HANGUP_LOCALUSERS;
  return ast_unregister_application (app);
}

int
load_module (void)
{
  return ast_register_application (app, privacy_exec, synopsis,
				   descrip);
}

char *
description (void)
{
  return tdesc;
}

int
usecount (void)
{
  int res;
  STANDARD_USECOUNT (res);
  return res;
}

char *
key ()
{
  return ASTERISK_GPL_KEY;
}


More information about the asterisk-users mailing list