public VoicemailService(WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider, PBXRegistrarService registrarService, Utilities.PluginManagement.PluginManager pluginManager, VoicemailMailerService vmMailerService) { this.dataProvider = dataProvider; this.registrarService = registrarService; this.vmMailerService = vmMailerService; this.pluginManager = pluginManager; }
public PBXRegistrarService(CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider /*, ExtensionStateService extStateService*/) { this.telecomProvider = telecomProvider; this.dataProvider = dataProvider; //this.extStateService = extStateService; presenceData = new List <PBXPresenceInfo>(); if (telecomProvider is CallButler.Telecom.inTELIPhoneTelecomProvider) { ipClient = ((CallButler.Telecom.inTELIPhoneTelecomProvider)telecomProvider).BaseProviderObject; ipClient.PreprocessSipRequest += new EventHandler <WOSI.NET.SIP.PreprocessSipRequestEventArgs>(ipClient_PreprocessSipRequest); } presenceTimeout = new System.Threading.Timer(new System.Threading.TimerCallback(PresenceTimeoutTimerProc), this, 0, 30000); }
protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { string scriptLocation = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory) + "\\Transfer Conference Participant.xml"; if (File.Exists(scriptLocation)) { IMLScript imlScript = IMLScript.OpenScript(scriptLocation); tsInterface.IMLInterpreter.SetLocalVariable("HoldMusicLocation", WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.HoldMusicRootDirectory)); tsInterface.IMLInterpreter.StartScript(imlScript, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory)); } }
protected virtual void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { }
protected virtual void OnLinkedExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { }
public TelecomScriptInterface(CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider, Utilities.PluginManagement.PluginManager pluginManager, PBXRegistrarService pbxRegistrar/*, ExtensionStateService extStateService*/, int lineNumber) { this.telecomProvider = telecomProvider; this.dataProvider = dataProvider; this.lineNumber = lineNumber; this.pluginManager = pluginManager; this.pbxRegistrar = pbxRegistrar; //this.extStateService = extStateService; // Attach to our telecom provider events telecomProvider.CallEnded += new EventHandler<LineEventArgs>(telecomProvider_CallEnded); telecomProvider.DTMFToneRecognized += new EventHandler<CallInputEventArgs>(telecomProvider_DTMFToneRecognized); telecomProvider.FinishedSpeaking += new EventHandler<LineEventArgs>(telecomProvider_FinishedSpeaking); telecomProvider.SoundFinishedPlaying += new EventHandler<LineEventArgs>(telecomProvider_SoundFinishedPlaying); telecomProvider.TransferFailed += new EventHandler<LineEventArgs>(telecomProvider_TransferFailed); telecomProvider.TransferSucceeded += new EventHandler<LineEventArgs>(telecomProvider_TransferSucceeded); telecomProvider.CallConnected += new EventHandler<CallEventArgs>(telecomProvider_CallConnected); telecomProvider.CallFailed += new EventHandler<CallFailureEventArgs>(telecomProvider_CallFailed); telecomProvider.FaxToneDetected += new EventHandler<LineEventArgs>(telecomProvider_FaxToneDetected); telecomProvider.RemoteOnHold += new EventHandler<LineEventArgs>(telecomProvider_RemoteOnHold); telecomProvider.RemoteOffHold += new EventHandler<LineEventArgs>(telecomProvider_RemoteOffHold); telecomProvider.SpeechRecognized += new EventHandler<CallInputEventArgs>(telecomProvider_SpeechRecognized); telecomProvider.IncomingTransfer += new EventHandler<CallButler.Telecom.TransferEventArgs>(telecomProvider_IncomingTransfer); telecomProvider.CallTemporarilyMoved += new EventHandler<CallEventArgs>(telecomProvider_CallTemporarilyMoved); telecomProvider.AnswerDetectHuman += new EventHandler<LineEventArgs>(telecomProvider_AnswerDetectHuman); telecomProvider.AnswerDetectMachine += new EventHandler<LineEventArgs>(telecomProvider_AnswerDetectMachine); telecomProvider.AnswerDetectMachineGreetingFinished += new EventHandler<LineEventArgs>(telecomProvider_AnswerDetectMachineGreetingFinished); imlInterp = new WOSI.IVR.IML.IMLInterpreter(WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.ImlPluginsFolder)); // Attach to our interpreter events imlInterp.AsyncExternalAction += new EventHandler<AsyncExternalActionEventArgs>(imlInterp_AsyncExternalAction); imlInterp.DeleteLastRecording += new EventHandler(imlInterp_DeleteLastRecording); imlInterp.CopyLastRecording += new EventHandler<SoundFileEventArgs>(imlInterp_CopyLastRecording); imlInterp.HangUp += new EventHandler(imlInterp_HangUp); imlInterp.PlaySound += new EventHandler<PlaySoundEventArgs>(imlInterp_PlaySound); imlInterp.ScriptError += new EventHandler<ScriptErrorEventArgs>(imlInterp_ScriptError); imlInterp.ScriptFinished += new EventHandler(imlInterp_ScriptFinished); imlInterp.SpeakText += new EventHandler<SpeakTextEventArgs>(imlInterp_SpeakText); imlInterp.StartRecording += new EventHandler<SoundFileEventArgs>(imlInterp_StartRecording); imlInterp.StopRecording += new EventHandler<StopRecordingEventArgs>(imlInterp_StopRecording); imlInterp.SyncExternalAction += new EventHandler<SyncExternalActionEventArgs>(imlInterp_SyncExternalAction); imlInterp.TransferCall += new EventHandler<WOSI.IVR.IML.TransferEventArgs>(imlInterp_TransferCall); imlInterp.Call += new EventHandler<TelephoneNumberEventArgs>(imlInterp_Call); imlInterp.StopAllSounds += new EventHandler(imlInterp_StopAllSounds); imlInterp.ScriptStarted += new EventHandler(imlInterp_ScriptStarted); imlInterp.NewSpeechPhrases += new EventHandler<SpeechPhraseEventArgs>(imlInterp_NewSpeechPhrases); imlInterp.TraceMessage += new EventHandler<TraceEventArgs>(imlInterp_TraceMessage); imlInterp.JoinConference += new EventHandler<ConferenceEventArgs>(imlInterp_JoinConference); imlInterp.LeaveConference += new EventHandler(imlInterp_LeaveConference); // Create our default internal provider WOSI.CallButler.Data.CallButlerDataset.ProvidersDataTable defaultInternalProviderTable = new WOSI.CallButler.Data.CallButlerDataset.ProvidersDataTable(); defaultInternalProvider = defaultInternalProviderTable.NewProvidersRow(); defaultInternalProvider.CustomerID = Properties.Settings.Default.CustomerID; defaultInternalProvider.AutoDetectAudio = true; defaultInternalProvider.EnableRegistration = false; defaultInternalProvider.SupressOutboundUsername = false; if (Properties.Settings.Default.InternalSIPDomain != null && Properties.Settings.Default.InternalSIPDomain.Length > 0) defaultInternalProvider.Domain = Properties.Settings.Default.InternalSIPDomain; else { // Get the IP of this machine try { System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()); defaultInternalProvider.Domain = telecomProvider.LocalIPAddress; } catch { defaultInternalProvider.Domain = Environment.MachineName; } } defaultInternalProvider.IsDefault = false; }
protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { string voicemailScriptLocation = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory) + "\\Voicemail.xml"; if (File.Exists(voicemailScriptLocation)) { IMLScript imlScript = IMLScript.OpenScript(voicemailScriptLocation); // Set our script variables tsInterface.IMLInterpreter.SetLocalVariable("ExtensionID", extension.ExtensionID.ToString()); //if (Licensing.Management.AppPermissions.StatIsPermitted("Settings.MusicSettings")) //{ tsInterface.IMLInterpreter.SetLocalVariable("HoldMusicLocation", WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.HoldMusicRootDirectory)); //} /*else * { * tsInterface.IMLInterpreter.SetLocalVariable("HoldMusicLocation", ""); * }*/ tsInterface.IMLInterpreter.SetLocalVariable("VoicemailRootFolder", WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.VoicemailRootDirectory)); tsInterface.IMLInterpreter.StartScript(imlScript, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory)); } }
protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { this.tsInterface = tsInterface; string scriptLocation = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory) + "\\Transfer Conference.xml"; if (File.Exists(scriptLocation)) { IMLScript imlScript = IMLScript.OpenScript(scriptLocation); tsInterface.IMLInterpreter.SetLocalVariable("HoldMusicLocation", WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.HoldMusicRootDirectory)); // Set our recording path tsInterface.IMLInterpreter.SetLocalVariable("RecordingPath", WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.CallRecordingSoundPath)); tsInterface.IMLInterpreter.SetLocalVariable("ExtensionID", extension.ExtensionID.ToString()); tsInterface.IMLInterpreter.StartScript(imlScript, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory)); } }
protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (Enum.IsDefined(typeof(Click2CallExternalCommands), command)) { Click2CallExternalCommands externalCommand = WOSI.Utilities.EnumUtils <Click2CallExternalCommands> .Parse(command); switch (externalCommand) { case Click2CallExternalCommands.CALLBUTLERINTERNAL_ExtensionNotAvailable: // Allow this to answer calls again tsInterface.Locked = false; break; case Click2CallExternalCommands.CALLBUTLERINTERNAL_ConnectCalls: // Check to see if this is a call to another extension int extensionNumber = 0; bool disableCallScreening = callMakerExtension == null ? false : true; if (int.TryParse(numberToDial, out extensionNumber)) { // If we're calling our own extension, send us to the voicemail management menu if (extensionNumber == callMakerExtension.ExtensionNumber) { callMakerInterface.ScriptProcessor = new VoicemailManagementScriptProcessor(callMakerExtension, scriptService.registrarService); callMakerInterface.ScriptProcessor.StartProcessing(callMakerInterface, telecomProvider, dataProvider); // Allow this to answer calls again tsInterface.Locked = false; break; } else { WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, extensionNumber); if (extension != null) { scriptService.TransferToExtension(extensionNumber.ToString(), callMakerInterface, disableCallScreening); // Allow this to answer calls again tsInterface.Locked = false; break; } } } // Send the caller to main menu if (numberToDial == "*") { scriptService.SetupAutoAttendantAnswer(callMakerInterface.LineNumber, callMakerInterface); callMakerInterface.ScriptProcessor.StartProcessing(callMakerInterface, telecomProvider, dataProvider); // Allow this to answer calls again tsInterface.Locked = false; break; } // If we get here, we make an outbound call to an external number if (callMakerExtension != null) { scriptService.MakeOutboundCall(callMakerInterface, numberToDial, string.Format("{0} {1}", callMakerExtension.FirstName, callMakerExtension.LastName), callMakerExtension.ExtensionNumber, false, true); } // Allow this to answer calls again tsInterface.Locked = false; break; } tsInterface.IMLInterpreter.SignalEventCallback(eventToken); } }
protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (Enum.IsDefined(typeof(OutboundCallExternalCommands), command)) { OutboundCallExternalCommands externalCommand = WOSI.Utilities.EnumUtils <OutboundCallExternalCommands> .Parse(command); switch (externalCommand) { case OutboundCallExternalCommands.CALLBUTLERINTERNAL_Reset: { tsInterface.Locked = false; break; } } } tsInterface.IMLInterpreter.SignalEventCallback(eventToken); }
protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { string scriptLocation = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory) + "\\Outbound Callee.xml"; if (File.Exists(scriptLocation)) { IMLScript imlScript = IMLScript.OpenScript(scriptLocation); tsInterface.IMLInterpreter.SetLocalVariable("HoldMusicLocation", WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.HoldMusicRootDirectory)); tsInterface.IMLInterpreter.SetLocalVariable("NumberToCall", numberToCall); tsInterface.IMLInterpreter.SetLocalVariable("FromCallerID", fromCallerID); tsInterface.IMLInterpreter.SetLocalVariable("CallProfile", ""); tsInterface.IMLInterpreter.StartScript(imlScript, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory)); } }
public TelecomScriptInterface(CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider, Utilities.PluginManagement.PluginManager pluginManager, PBXRegistrarService pbxRegistrar /*, ExtensionStateService extStateService*/, int lineNumber) { this.telecomProvider = telecomProvider; this.dataProvider = dataProvider; this.lineNumber = lineNumber; this.pluginManager = pluginManager; this.pbxRegistrar = pbxRegistrar; //this.extStateService = extStateService; // Attach to our telecom provider events telecomProvider.CallEnded += new EventHandler <LineEventArgs>(telecomProvider_CallEnded); telecomProvider.DTMFToneRecognized += new EventHandler <CallInputEventArgs>(telecomProvider_DTMFToneRecognized); telecomProvider.FinishedSpeaking += new EventHandler <LineEventArgs>(telecomProvider_FinishedSpeaking); telecomProvider.SoundFinishedPlaying += new EventHandler <LineEventArgs>(telecomProvider_SoundFinishedPlaying); telecomProvider.TransferFailed += new EventHandler <LineEventArgs>(telecomProvider_TransferFailed); telecomProvider.TransferSucceeded += new EventHandler <LineEventArgs>(telecomProvider_TransferSucceeded); telecomProvider.CallConnected += new EventHandler <CallEventArgs>(telecomProvider_CallConnected); telecomProvider.CallFailed += new EventHandler <CallFailureEventArgs>(telecomProvider_CallFailed); telecomProvider.FaxToneDetected += new EventHandler <LineEventArgs>(telecomProvider_FaxToneDetected); telecomProvider.RemoteOnHold += new EventHandler <LineEventArgs>(telecomProvider_RemoteOnHold); telecomProvider.RemoteOffHold += new EventHandler <LineEventArgs>(telecomProvider_RemoteOffHold); telecomProvider.SpeechRecognized += new EventHandler <CallInputEventArgs>(telecomProvider_SpeechRecognized); telecomProvider.IncomingTransfer += new EventHandler <CallButler.Telecom.TransferEventArgs>(telecomProvider_IncomingTransfer); telecomProvider.CallTemporarilyMoved += new EventHandler <CallEventArgs>(telecomProvider_CallTemporarilyMoved); telecomProvider.AnswerDetectHuman += new EventHandler <LineEventArgs>(telecomProvider_AnswerDetectHuman); telecomProvider.AnswerDetectMachine += new EventHandler <LineEventArgs>(telecomProvider_AnswerDetectMachine); telecomProvider.AnswerDetectMachineGreetingFinished += new EventHandler <LineEventArgs>(telecomProvider_AnswerDetectMachineGreetingFinished); imlInterp = new WOSI.IVR.IML.IMLInterpreter(WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.ImlPluginsFolder)); // Attach to our interpreter events imlInterp.AsyncExternalAction += new EventHandler <AsyncExternalActionEventArgs>(imlInterp_AsyncExternalAction); imlInterp.DeleteLastRecording += new EventHandler(imlInterp_DeleteLastRecording); imlInterp.CopyLastRecording += new EventHandler <SoundFileEventArgs>(imlInterp_CopyLastRecording); imlInterp.HangUp += new EventHandler(imlInterp_HangUp); imlInterp.PlaySound += new EventHandler <PlaySoundEventArgs>(imlInterp_PlaySound); imlInterp.ScriptError += new EventHandler <ScriptErrorEventArgs>(imlInterp_ScriptError); imlInterp.ScriptFinished += new EventHandler(imlInterp_ScriptFinished); imlInterp.SpeakText += new EventHandler <SpeakTextEventArgs>(imlInterp_SpeakText); imlInterp.StartRecording += new EventHandler <SoundFileEventArgs>(imlInterp_StartRecording); imlInterp.StopRecording += new EventHandler <StopRecordingEventArgs>(imlInterp_StopRecording); imlInterp.SyncExternalAction += new EventHandler <SyncExternalActionEventArgs>(imlInterp_SyncExternalAction); imlInterp.TransferCall += new EventHandler <WOSI.IVR.IML.TransferEventArgs>(imlInterp_TransferCall); imlInterp.Call += new EventHandler <TelephoneNumberEventArgs>(imlInterp_Call); imlInterp.StopAllSounds += new EventHandler(imlInterp_StopAllSounds); imlInterp.ScriptStarted += new EventHandler(imlInterp_ScriptStarted); imlInterp.NewSpeechPhrases += new EventHandler <SpeechPhraseEventArgs>(imlInterp_NewSpeechPhrases); imlInterp.TraceMessage += new EventHandler <TraceEventArgs>(imlInterp_TraceMessage); imlInterp.JoinConference += new EventHandler <ConferenceEventArgs>(imlInterp_JoinConference); imlInterp.LeaveConference += new EventHandler(imlInterp_LeaveConference); // Create our default internal provider WOSI.CallButler.Data.CallButlerDataset.ProvidersDataTable defaultInternalProviderTable = new WOSI.CallButler.Data.CallButlerDataset.ProvidersDataTable(); defaultInternalProvider = defaultInternalProviderTable.NewProvidersRow(); defaultInternalProvider.CustomerID = Properties.Settings.Default.CustomerID; defaultInternalProvider.AutoDetectAudio = true; defaultInternalProvider.EnableRegistration = false; defaultInternalProvider.SupressOutboundUsername = false; if (Properties.Settings.Default.InternalSIPDomain != null && Properties.Settings.Default.InternalSIPDomain.Length > 0) { defaultInternalProvider.Domain = Properties.Settings.Default.InternalSIPDomain; } else { // Get the IP of this machine try { System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()); defaultInternalProvider.Domain = telecomProvider.LocalIPAddress; } catch { defaultInternalProvider.Domain = Environment.MachineName; } } defaultInternalProvider.IsDefault = false; }
protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (Enum.IsDefined(typeof(ReceptionistFinderExternalCommands), command)) { ReceptionistFinderExternalCommands externalCommand = WOSI.Utilities.EnumUtils <ReceptionistFinderExternalCommands> .Parse(command); switch (externalCommand) { case ReceptionistFinderExternalCommands.CALLBUTLERINTERNAL_SendToAutoAttendant: { scriptService.ProcessAutoAttendantAnswer(tsInterface.LineNumber, tsInterface, false); break; } case ReceptionistFinderExternalCommands.CALLBUTLERINTERNAL_AnswerCall: { if (telecomProvider.IsLineInUse(tsInterface.LineNumber)) { if (tsInterface.Extension != null) { telecomProvider.AnswerCall(tsInterface.LineNumber, true); } else { telecomProvider.AnswerCall(tsInterface.LineNumber, false); } } break; } } } }
protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { string scriptLocation = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory) + "\\Receptionist Finder.xml"; if (File.Exists(scriptLocation)) { IMLScript imlScript = IMLScript.OpenScript(scriptLocation); // Set our script variables tsInterface.IMLInterpreter.SetLocalVariable("ExtensionID", extension.ExtensionID.ToString()); tsInterface.IMLInterpreter.StartScript(imlScript, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory)); } }
public DialPlanManagerService(PBXRegistrarService pbxRegistrar, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider, Telecom.TelecomProviderBase telecomProvider) { this.pbxRegistrar = pbxRegistrar; this.dataProvider = dataProvider; this.telecomProvider = telecomProvider; }
protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (Enum.IsDefined(typeof(StandardExternalCommands), command)) { StandardExternalCommands externalCommand = WOSI.Utilities.EnumUtils <StandardExternalCommands> .Parse(command); switch (externalCommand) { case StandardExternalCommands.CALLBUTLERINTERNAL_ChooseLanguage: { if (!Properties.Settings.Default.Multilingual) { tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_NotMultilingual.ToString()); } else { tsInterface.IMLInterpreter.SignalEventCallback(eventToken); } break; } case StandardExternalCommands.CALLBUTLERINTERNAL_SetLanguageID: { List <string> languages = new List <string>(); languages.Add(Properties.Settings.Default.DefaultLanguage); languages.AddRange(Properties.Settings.Default.Languages.Split(';')); int languageNumber = Convert.ToInt32(commandData); if (languageNumber > 0 && languageNumber <= languages.Count) { // Set our language ID variable tsInterface.IMLInterpreter.SetLocalVariable("LanguageID", languages[languageNumber - 1]); tsInterface.IMLInterpreter.SignalEventCallback(eventToken); } else { tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_InvalidLanguage.ToString()); } break; } case StandardExternalCommands.CALLBUTLERINTERNAL_ProcessMainMenuOption: { WOSI.CallButler.Data.CallButlerDataset.DepartmentsDataTable departments = dataProvider.GetDepartments(Properties.Settings.Default.CustomerID); WOSI.CallButler.Data.CallButlerDataset.DepartmentsRow[] choosenDepartments = (WOSI.CallButler.Data.CallButlerDataset.DepartmentsRow[])departments.Select("OptionNumber = " + commandData); if (choosenDepartments.Length > 0) { WOSI.CallButler.Data.CallButlerDataset.DepartmentsRow choosenDepartment = choosenDepartments[0]; switch (choosenDepartment.Type) { case (short)WOSI.CallButler.Data.DepartmentTypes.Greeting: tsInterface.IMLInterpreter.SetLocalVariable("MainMenuOptionGreetingID", choosenDepartment.DepartmentID.ToString()); tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_GreetingMenuOption.ToString()); break; case (short)WOSI.CallButler.Data.DepartmentTypes.Extension: // Find our extension number try { WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtension(Properties.Settings.Default.CustomerID, new Guid(choosenDepartment.Data1)); if (extension != null) { tsInterface.IMLInterpreter.SetLocalVariable("Extension", extension.ExtensionNumber.ToString()); } } catch { } tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_ExtensionMenuOption.ToString()); break; case (short)WOSI.CallButler.Data.DepartmentTypes.Script: tsInterface.IMLInterpreter.SetLocalVariable("CustomScriptPath", choosenDepartment.Data1); tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_ScriptMenuOption.ToString()); break; case (short)WOSI.CallButler.Data.DepartmentTypes.Number: tsInterface.IMLInterpreter.SetLocalVariable("TransferToNumber", choosenDepartment.Data1); tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_NumberTransferMenuOption.ToString()); break; case (short)WOSI.CallButler.Data.DepartmentTypes.Module: tsInterface.IMLInterpreter.SetLocalVariable("AddonModuleID", choosenDepartment.Data1); tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_AddonModuleMenuOption.ToString()); break; } } else { tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_InvalidMenuOption.ToString()); } break; } case StandardExternalCommands.CALLBUTLERINTERNAL_DialByNameSearch: // Find our extensions for this search string WOSI.CallButler.Data.CallButlerDataset.ExtensionsDataTable extensions = dataProvider.GetExtensions(Properties.Settings.Default.CustomerID); WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow[] matchingExtensions = (WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow[])extensions.Select("SearchNumber LIKE '" + commandData + "*' AND EnableSearch = True"); // Get our extension search index int searchIndex = Convert.ToInt32(tsInterface.IMLInterpreter.GetLocalVariable("ExtensionSearchIndex")); searchIndex++; if (matchingExtensions.Length > 0 && searchIndex < matchingExtensions.Length) { tsInterface.IMLInterpreter.SetLocalVariable("Extension", matchingExtensions[searchIndex].ExtensionNumber.ToString()); tsInterface.IMLInterpreter.SetLocalVariable("ExtensionName", matchingExtensions[searchIndex].FirstName + " " + matchingExtensions[searchIndex].LastName); tsInterface.IMLInterpreter.SetLocalVariable("ExtensionSearchIndex", searchIndex.ToString()); } else { tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_ExtensionNotFound.ToString()); } tsInterface.IMLInterpreter.SignalEventCallback(eventToken); break; case StandardExternalCommands.CALLBUTLERINTERNAL_VoicemailManagement: { try { WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, Convert.ToInt32(tsInterface.IMLInterpreter.GetLocalVariable("Extension"))); if (extension != null) { tsInterface.ScriptProcessor = new VoicemailManagementScriptProcessor(extension, pbxRegistrar); tsInterface.ScriptProcessor.StartProcessing(tsInterface, telecomProvider, dataProvider); break; } } catch { } tsInterface.IMLInterpreter.SignalTransferFailure(); break; } /*case StandardExternalCommands.CALLBUTLERINTERNAL_StartAddonModule: * { * CallButler.Service.Plugin.CallButlerAddonModulePlugin[] addonModules = pluginManager.GetAllPluginsOfType<CallButler.Service.Plugin.CallButlerAddonModulePlugin>(); * * foreach (CallButler.Service.Plugin.CallButlerAddonModulePlugin addonModule in addonModules) * { * if (addonModule.PluginID.ToString() == commandData) * { * try * { * // Make sure the module is licensed * if (!addonModule.IsLicensed) * break; * * // We found our module and we should load the script it uses * tsInterface.ScriptProcessor = new AddonModuleScriptProcessor(addonModule); * tsInterface.ScriptProcessor.StartProcessing(tsInterface, telecomProvider, dataProvider); * return; * * } * catch (Exception e) * { * LoggingService.AddLogEntry(WOSI.CallButler.ManagementInterface.LogLevel.ErrorsOnly, "Failed to load Addon-Module '" + addonModule.PluginName + "'\r\n\r\n" + e.Message + "\r\n\r\n" + e.StackTrace, true); * } * } * } * * tsInterface.ScriptProcessor = this; * tsInterface.IMLInterpreter.SignalExternalEvent(StandardExternalEvents.CALLBUTLERINTERNAL_AddonModuleFailed.ToString()); * * break; * }*/ } } }
protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (Enum.IsDefined(typeof(OutboundCalleeScriptProcessor.OutboundCallExternalCommands), command)) { OutboundCalleeScriptProcessor.OutboundCallExternalCommands externalCommand = WOSI.Utilities.EnumUtils <OutboundCalleeScriptProcessor.OutboundCallExternalCommands> .Parse(command); switch (externalCommand) { case OutboundCalleeScriptProcessor.OutboundCallExternalCommands.CALLBUTLERINTERNAL_CallEnded: ProcessEndCall(telecomProvider); break; case OutboundCalleeScriptProcessor.OutboundCallExternalCommands.CALLBUTLERINTERNAL_HoldCaller: // Remove this call from the conference tsInterface.ProcessOnHold(conferenceID, true); // Tell the other caller to play hold music outboundTsInterface.IMLInterpreter.SignalExternalEvent(OutboundCalleeScriptProcessor.OutboundCallExternalCommands.CALLBUTLERINTERNAL_HoldCaller.ToString()); break; case OutboundCalleeScriptProcessor.OutboundCallExternalCommands.CALLBUTLERINTERNAL_UnholdCaller: // Add this caller back into the conference tsInterface.ProcessOnHold(conferenceID, false); // Tell the other caller to stop hold music outboundTsInterface.IMLInterpreter.SignalExternalEvent(OutboundCalleeScriptProcessor.OutboundCallExternalCommands.CALLBUTLERINTERNAL_UnholdCaller.ToString()); break; case OutboundCalleeScriptProcessor.OutboundCallExternalCommands.CALLBUTLERINTERNAL_TransferCaller: TransferCaller(telecomProvider, commandData); break; } } tsInterface.IMLInterpreter.SignalEventCallback(eventToken); }
protected override void OnLinkedExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (Enum.IsDefined(typeof(OutboundCalleeScriptProcessor.OutboundCallExternalCommands), command)) { OutboundCalleeScriptProcessor.OutboundCallExternalCommands externalCommand = WOSI.Utilities.EnumUtils <OutboundCalleeScriptProcessor.OutboundCallExternalCommands> .Parse(command); switch (externalCommand) { case OutboundCalleeScriptProcessor.OutboundCallExternalCommands.CALLBUTLERINTERNAL_CallFailed: { this.thisTsInterface.IMLInterpreter.SignalCallFailure(); break; } case OutboundCalleeScriptProcessor.OutboundCallExternalCommands.CALLBUTLERINTERNAL_CallConnected: { // Conference the two callers conferenceID = telecomProvider.ConferenceLines(this.thisTsInterface.LineNumber, tsInterface.LineNumber); this.thisTsInterface.IMLInterpreter.SignalExternalEvent(OutboundCallExternalEvents.CALLBUTLERINTERNAL_ConferenceStarted.ToString()); break; } case OutboundCalleeScriptProcessor.OutboundCallExternalCommands.CALLBUTLERINTERNAL_CallEnded: { ProcessEndCall(telecomProvider); break; } } } //tsInterface.IMLInterpreter.SignalEventCallback(eventToken); }
protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (callerTsInterface != null && Enum.IsDefined(typeof(TransferConferenceExternalCommands), command)) { TransferConferenceExternalCommands externalCommand = WOSI.Utilities.EnumUtils <TransferConferenceExternalCommands> .Parse(command); switch (externalCommand) { case TransferConferenceExternalCommands.CALLBUTLERINTERNAL_EndConference: telecomProvider.EndConference(conferenceID, true); break; case TransferConferenceExternalCommands.CALLBUTLERINTERNAL_RecordingStarted: // Notify the other caller that recording has started callerTsInterface.IMLInterpreter.SignalExternalEvent(TransferConferenceExternalEvents.CALLBUTLERINTERNAL_RecordingStarted.ToString()); break; case TransferConferenceExternalCommands.CALLBUTLERINTERNAL_RecordingFinished: // Notify the other caller that recording has finished callerTsInterface.IMLInterpreter.SignalExternalEvent(TransferConferenceExternalEvents.CALLBUTLERINTERNAL_RecordingFinished.ToString()); vmMailerService.QueueVoicemailEmail(extension, "Your Call Recording", "Call Recording", tsInterface.IMLInterpreter.GetLocalVariable("RecordingFilename")); break; case TransferConferenceExternalCommands.CALLBUTLERINTERNAL_TransferCaller: TransferCaller(telecomProvider, commandData); break; case TransferConferenceExternalCommands.CALLBUTLERINTERNAL_HoldCaller: // Remove this call from the conference tsInterface.ProcessOnHold(conferenceID, true); // Tell the other caller to play hold music callerTsInterface.IMLInterpreter.SignalExternalEvent(TransferConferenceExternalEvents.CALLBUTLERINTERNAL_HoldCall.ToString()); break; case TransferConferenceExternalCommands.CALLBUTLERINTERNAL_UnholdCaller: // Add this caller back into the conference tsInterface.ProcessOnHold(conferenceID, false); // Tell the other caller to stop hold music callerTsInterface.IMLInterpreter.SignalExternalEvent(TransferConferenceExternalEvents.CALLBUTLERINTERNAL_UnholdCall.ToString()); break; } } tsInterface.IMLInterpreter.SignalEventCallback(eventToken); }
protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { string scriptLocation = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory) + "\\Outbound Call.xml"; if (File.Exists(scriptLocation)) { IMLScript imlScript = IMLScript.OpenScript(scriptLocation); tsInterface.IMLInterpreter.SetLocalVariable("HoldMusicLocation", WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.HoldMusicRootDirectory)); tsInterface.IMLInterpreter.StartScript(imlScript, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory)); WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtensionNumber(Properties.Settings.Default.CustomerID, outboundExtensionNumber); // If the outbound ts interface is null, then this means we don't have any available lines to make outbound calls. // Also check to see if this extension is allowed to make outbound calls if (outboundTsInterface == null || (outboundExtensionNumber >= 0 && extension != null && !extension.EnableOutboundCalls)) { tsInterface.IMLInterpreter.SignalCallFailure(); outboundTsInterface.Locked = false; } else { // Link to our outbound script processor and start it outboundTsInterface.ScriptProcessor.LinkScriptProcessor(this); outboundTsInterface.ScriptProcessor.StartProcessing(outboundTsInterface, telecomProvider, dataProvider); } } }
protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (Enum.IsDefined(typeof(VoicemailExternalCommands), command)) { VoicemailExternalCommands externalCommand = WOSI.Utilities.EnumUtils <VoicemailExternalCommands> .Parse(command); switch (externalCommand) { case VoicemailExternalCommands.CALLBUTLERINTERNAL_AuthenticatePasscode: { // Check to make sure our passcode matches our extension string enteredPasscodeHash = WOSI.Utilities.CryptoUtils.CreateMD5Hash(commandData); if (enteredPasscodeHash != extension.Password) { tsInterface.IMLInterpreter.SignalExternalEvent(VoicemailExternalEvents.CALLBUTLERINTERNAL_InvalidPasscode.ToString()); } else { // Get our new voicemail count int newVoicemailCount = dataProvider.GetNewVoicemailCount(extension.ExtensionID); tsInterface.IMLInterpreter.SetLocalVariable("NewVoicemailCount", newVoicemailCount.ToString()); tsInterface.IMLInterpreter.SignalExternalEvent(VoicemailExternalEvents.CALLBUTLERINTERNAL_ValidPasscode.ToString()); } break; } case VoicemailExternalCommands.CALLBUTLERINTERNAL_SaveNewGreeting: { WOSI.CallButler.Data.CallButlerDataset.LocalizedGreetingsRow voicemailGreeting = dataProvider.GetLocalizedGreeting(Properties.Settings.Default.CustomerID, extension.ExtensionID, Properties.Settings.Default.DefaultLanguage); string tmpGreetingFilename = commandData; if (File.Exists(tmpGreetingFilename) && voicemailGreeting != null) { // Change our voicemail greeting to a sound file voicemailGreeting.Type = (short)WOSI.CallButler.Data.GreetingType.SoundGreeting; // Move our greeting sound over string greetingDirectory = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.GreetingSoundRootDirectory) + "\\" + Properties.Settings.Default.DefaultLanguage; string greetingFilename = greetingDirectory + "\\" + voicemailGreeting.GreetingID.ToString() + ".snd"; if (!Directory.Exists(greetingDirectory)) { Directory.CreateDirectory(greetingDirectory); } File.Copy(tmpGreetingFilename, greetingFilename, true); File.Delete(tmpGreetingFilename); voicemailGreeting.Data = WOSI.Utilities.CryptoUtils.GetFileChecksum(greetingFilename); dataProvider.PersistLocalizedGreeting(Properties.Settings.Default.CustomerID, voicemailGreeting); } tsInterface.IMLInterpreter.SignalEventCallback(eventToken); break; } case VoicemailExternalCommands.CALLBUTLERINTERNAL_FetchNextVoicemail: { // Get our voicemail rows WOSI.CallButler.Data.CallButlerDataset.VoicemailsRow[] voicemails = (WOSI.CallButler.Data.CallButlerDataset.VoicemailsRow[])dataProvider.GetVoicemails(extension.ExtensionID).Select("", "Timestamp DESC"); // Get our voicemail message index int voicemailIndex = Convert.ToInt32(tsInterface.IMLInterpreter.GetLocalVariable("VoicemailIndex")); voicemailIndex++; if (voicemailIndex < voicemails.Length) { WOSI.CallButler.Data.CallButlerDataset.VoicemailsRow voicemail = voicemails[voicemailIndex]; // Create our voicemail intro string voicemailIntro = ""; if (voicemailIndex == 0) { voicemailIntro = "First "; } else { voicemailIntro = "Next "; } if (voicemail.IsNew) { voicemailIntro += "New "; } voicemailIntro += "Message received on " + voicemail.Timestamp.ToShortDateString() + " " + voicemail.Timestamp.ToShortTimeString(); tsInterface.IMLInterpreter.SetLocalVariable("VoicemailIntro", voicemailIntro); string voicemailFilename = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.VoicemailRootDirectory) + "\\" + voicemail.ExtensionID.ToString() + "\\" + voicemail.VoicemailID + ".snd"; tsInterface.IMLInterpreter.SetLocalVariable("VoicemailSound", voicemailFilename); tsInterface.IMLInterpreter.SetLocalVariable("VoicemailIndex", voicemailIndex.ToString()); // Mark the voicemail as read dataProvider.MarkVoicemailRead(voicemail.ExtensionID, voicemail.VoicemailID); if (pbxRegistrar != null) { pbxRegistrar.SendMessageWaitingNotification(voicemail.ExtensionID); } tsInterface.IMLInterpreter.SignalEventCallback(eventToken); } else { tsInterface.IMLInterpreter.SignalExternalEvent(VoicemailExternalEvents.CALLBUTLERINTERNAL_EndOfMessages.ToString()); } break; } case VoicemailExternalCommands.CALLBUTLERINTERNAL_DeleteVoicemail: { // Get our voicemail rows WOSI.CallButler.Data.CallButlerDataset.VoicemailsRow[] voicemails = (WOSI.CallButler.Data.CallButlerDataset.VoicemailsRow[])dataProvider.GetVoicemails(extension.ExtensionID).Select("", "Timestamp DESC"); // Get our voicemail message index int voicemailIndex = Convert.ToInt32(tsInterface.IMLInterpreter.GetLocalVariable("VoicemailIndex")); if (voicemailIndex < voicemails.Length) { WOSI.CallButler.Data.CallButlerDataset.VoicemailsRow voicemail = voicemails[voicemailIndex]; // Delete our voicemail dataProvider.DeleteVoicemail(voicemail.ExtensionID, voicemail.VoicemailID); // Delete our voicemail sound string voicemailFilename = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.VoicemailRootDirectory) + "\\" + voicemail.ExtensionID.ToString() + "\\" + voicemail.VoicemailID + ".snd"; if (File.Exists(voicemailFilename)) { File.Delete(voicemailFilename); } voicemailIndex--; tsInterface.IMLInterpreter.SetLocalVariable("VoicemailIndex", voicemailIndex.ToString()); if (pbxRegistrar != null) { pbxRegistrar.SendMessageWaitingNotification(voicemail.ExtensionID); } } tsInterface.IMLInterpreter.SignalEventCallback(eventToken); break; } } } }
public PBXRegistrarService(CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider/*, ExtensionStateService extStateService*/) { this.telecomProvider = telecomProvider; this.dataProvider = dataProvider; //this.extStateService = extStateService; presenceData = new List<PBXPresenceInfo>(); if (telecomProvider is CallButler.Telecom.inTELIPhoneTelecomProvider) { ipClient = ((CallButler.Telecom.inTELIPhoneTelecomProvider)telecomProvider).BaseProviderObject; ipClient.PreprocessSipRequest += new EventHandler<WOSI.NET.SIP.PreprocessSipRequestEventArgs>(ipClient_PreprocessSipRequest); } presenceTimeout = new System.Threading.Timer(new System.Threading.TimerCallback(PresenceTimeoutTimerProc), this, 0, 30000); }
protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (Enum.IsDefined(typeof(VoicemailExternalCommands), command)) { VoicemailExternalCommands externalCommand = WOSI.Utilities.EnumUtils <VoicemailExternalCommands> .Parse(command); switch (externalCommand) { case VoicemailExternalCommands.CALLBUTLERINTERNAL_NewVoicemail: { // Create a new voicemail record vmService.CreateVoicemail(new Guid(commandData), new Guid(tsInterface.IMLInterpreter.GetLocalVariable("ExtensionID")), tsInterface.IMLInterpreter.CallerDisplayName, tsInterface.IMLInterpreter.CallerHost, tsInterface.IMLInterpreter.CallerUsername); break; } case VoicemailExternalCommands.CALLBUTLERINTERNAL_VoicemailManagement: { tsInterface.ScriptProcessor = new VoicemailManagementScriptProcessor(extension, registrarService); tsInterface.ScriptProcessor.StartProcessing(tsInterface, telecomProvider, dataProvider); break; } } tsInterface.IMLInterpreter.SignalEventCallback(eventToken); } }
protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { string scheduleReminderScriptLocation = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory) + "\\Schedule Reminder.xml"; if (File.Exists(scheduleReminderScriptLocation)) { IMLScript imlScript = IMLScript.OpenScript(scheduleReminderScriptLocation); extensionNumberIndex = -1; tsInterface.IMLInterpreter.StartScript(imlScript, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory)); } }
protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { LoggingService.AddLogEntry(LogLevel.Extended, "(Line " + tsInterface.LineNumber + ") Executing custom script at " + customScriptLocation, false); IMLScript imlScript = new IMLScript(); ScriptPage introPage = new ScriptPage(); introPage.ID = Guid.NewGuid().ToString(); /*if (LicenseService.IsTrialLicense()) * { * if (Properties.Settings.Default.WelcomeGreetingDelay > 0) * { * Delay welcomeDelay = new Delay(); * welcomeDelay.DelayTime = Properties.Settings.Default.WelcomeGreetingDelay.ToString(); * introPage.Actions.Add(welcomeDelay); * } * * introPage.Actions.Add(ScriptCompilers.ScriptUtils.CreateExternalAction(ScriptCompilers.BaseExternalCommands.CALLBUTLERINTERNAL_PlayLicenseIntroGreeting.ToString(), "")); * }*/ ScriptCompilers.ScriptUtils.ProcessPersonalizedGreeting(dataProvider, ref introPage, Properties.Settings.Default.CustomerID, tsInterface.IMLInterpreter.CallerDisplayName, tsInterface.IMLInterpreter.CallerUsername, tsInterface.IMLInterpreter.CallerHost, tsInterface.IMLInterpreter.DialedUsername); GotoPage gotoPage = new GotoPage(); gotoPage.Location = customScriptLocation; introPage.Actions.Add(gotoPage); imlScript.Pages.Add(introPage); tsInterface.IMLInterpreter.StartScript(imlScript, System.IO.Path.GetDirectoryName(customScriptLocation)); }
protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (Enum.IsDefined(typeof(ScheduleReminderExternalCommands), command)) { ScheduleReminderExternalCommands externalCommand = WOSI.Utilities.EnumUtils <ScheduleReminderExternalCommands> .Parse(command); switch (externalCommand) { case ScheduleReminderExternalCommands.CALLBUTLERINTERNAL_GetNextNumber: { // If we have a previous call, end it if (telecomProvider.IsLineInUse(tsInterface.LineNumber)) { telecomProvider.EndCall(tsInterface.LineNumber); } extensionNumberIndex++; // Get our extension contact numbers WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersRow[] contactNumbers = (WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersRow[])dataProvider.GetExtensionContactNumbers(extension.ExtensionID).Select("", "Priority ASC"); while (extensionNumberIndex < contactNumbers.Length) { WOSI.CallButler.Data.CallButlerDataset.ExtensionContactNumbersRow contactNumber = contactNumbers[extensionNumberIndex]; // Is the number online? if (contactNumber.Online) { // Does the number have hours? if (!contactNumber.HasHoursOfOperation || (contactNumber.HasHoursOfOperation && ScriptUtils.IsInHoursOfOperation(contactNumber.HoursOfOperation, contactNumber.HoursOfOperationUTCOffset))) { // If we get here, try the number tsInterface.IMLInterpreter.SetLocalVariable("NumberToCall", contactNumber.ContactNumber); tsInterface.IMLInterpreter.SetLocalVariable("ExtensionTimeout", contactNumber.Timeout.ToString()); string introDetails = "You have " + reminders.Length + " upcoming appointment"; if (reminders.Length > 1) { introDetails += "s"; } introDetails += "."; tsInterface.IMLInterpreter.SetLocalVariable("IntroDetails", introDetails); tsInterface.IMLInterpreter.SignalEventCallback(eventToken); return; } } extensionNumberIndex++; } if (telecomProvider.IsLineInUse(tsInterface.LineNumber)) { telecomProvider.EndCall(tsInterface.LineNumber); } tsInterface.IMLInterpreter.StopScript(); break; } case ScheduleReminderExternalCommands.CALLBUTLERINTERNAL_FetchNextReminder: { reminderIndex++; if (reminderIndex < reminders.Length) { OutlookReminder reminder = reminders[reminderIndex]; tsInterface.IMLInterpreter.SetLocalVariable("ScheduleDetails", GetReminderDetails(reminder)); if (reminderIndex == reminders.Length - 1) { tsInterface.IMLInterpreter.SignalExternalEvent(ScheduleReminderExternalEvents.CALLBUTLERINTERNAL_LastReminder.ToString()); } else { tsInterface.IMLInterpreter.SignalEventCallback(eventToken); } } else { tsInterface.IMLInterpreter.SignalExternalEvent(ScheduleReminderExternalEvents.CALLBUTLERINTERNAL_EndOfReminders.ToString()); } break; } } } }
public void StartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { OnStartProcessing(tsInterface, telecomProvider, dataProvider); }
public void ProcessExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider, Utilities.PluginManagement.PluginManager pluginManager, PBXRegistrarService pbxRegistrar) { // Parse out our external event action if (Enum.IsDefined(typeof(BaseExternalCommands), command)) { BaseExternalCommands externalCommand = WOSI.Utilities.EnumUtils <BaseExternalCommands> .Parse(command); string languageID = "en"; switch (externalCommand) { case BaseExternalCommands.CALLBUTLERINTERNAL_StartAddonModule: CallButler.Service.Plugin.CallButlerAddonModulePlugin[] addonModules = pluginManager.GetAllPluginsOfType <CallButler.Service.Plugin.CallButlerAddonModulePlugin>(); foreach (CallButler.Service.Plugin.CallButlerAddonModulePlugin addonModule in addonModules) { if (addonModule.PluginID.ToString() == commandData) { try { // Make sure the module is licensed if (!addonModule.IsLicensed) { break; } // We found our module and we should load the script it uses tsInterface.ScriptProcessor = new AddonModuleScriptProcessor(addonModule); tsInterface.ScriptProcessor.StartProcessing(tsInterface, telecomProvider, dataProvider); return; } catch (Exception e) { LoggingService.AddLogEntry(WOSI.CallButler.ManagementInterface.LogLevel.ErrorsOnly, "Failed to load Addon-Module '" + addonModule.PluginName + "'\r\n\r\n" + e.Message + "\r\n\r\n" + e.StackTrace, true); } } } break; case BaseExternalCommands.CALLBUTLERINTERNAL_ReturnToCallFlowMainMenu: // Return to the Call flow main menu. tsInterface.ScriptProcessor = new StandardScriptProcessor(pluginManager, pbxRegistrar); ((StandardScriptProcessor)tsInterface.ScriptProcessor).StartFromMainMenu(tsInterface); break; case BaseExternalCommands.CALLBUTLERINTERNAL_PlayLicenseIntroGreeting: // If the line isn't in use, don't do anything if (!telecomProvider.IsLineInUse(tsInterface.LineNumber)) { tsInterface.IMLInterpreter.SignalEventCallback(eventToken); break; } // Read our intro sound bytes byte[] introSoundBytes = null; if (telecomProvider.AudioInputRate == 8000) { introSoundBytes = new byte[Properties.Resources.powered_by_8khz.Length]; Properties.Resources.powered_by_8khz.Read(introSoundBytes, 0, introSoundBytes.Length); } else if (telecomProvider.AudioInputRate == 16000) { introSoundBytes = new byte[Properties.Resources.powered_by_16khz.Length]; Properties.Resources.powered_by_16khz.Read(introSoundBytes, 0, introSoundBytes.Length); } // Play our license intro sound if (introSoundBytes != null) { telecomProvider.PlaySound(tsInterface.LineNumber, introSoundBytes); } break; case BaseExternalCommands.CALLBUTLERINTERNAL_PlaySystemSound: // If the line isn't in use, don't do anything if (!telecomProvider.IsLineInUse(tsInterface.LineNumber)) { tsInterface.IMLInterpreter.SignalEventCallback(eventToken); break; } // Get the sound with the current language languageID = tsInterface.IMLInterpreter.GetLocalVariable("LanguageID"); string soundFilename = GetSoundFileForLanguage(languageID, commandData); if (soundFilename == null) { // If we don't get a sound with the current language, try the default language soundFilename = GetSoundFileForLanguage(Properties.Settings.Default.DefaultLanguage, commandData); if (soundFilename == null) { // If we don't get a sound file with the default language, try english soundFilename = GetSoundFileForLanguage("en", commandData); if (soundFilename == null) { if (!File.Exists(soundFilename)) { // If the sound still doesn't exist, tell the IML interpreter to move on tsInterface.IMLInterpreter.SignalEventCallback(eventToken); break; } } } } // If we get here, our system sound should exist and we should play it. if (string.Compare(commandData, "ring.snd", true) == 0) { telecomProvider.PlaySound(tsInterface.LineNumber, soundFilename, true); } else { telecomProvider.PlaySound(tsInterface.LineNumber, soundFilename, false); } LoggingService.AddLogEntry(LogLevel.Extended, "(Line " + tsInterface.LineNumber + ") Playing sound at " + soundFilename, false); break; case BaseExternalCommands.CALLBUTLERINTERNAL_PlayGreeting: // If the line isn't in use, don't do anything if (!telecomProvider.IsLineInUse(tsInterface.LineNumber)) { tsInterface.IMLInterpreter.SignalEventCallback(eventToken); break; } // Get our current language languageID = tsInterface.IMLInterpreter.GetLocalVariable("LanguageID"); // Create our greetingID Guid greetingID = new Guid(commandData); // Get the greeting in our selected language WOSI.CallButler.Data.CallButlerDataset.GreetingsRow greeting = dataProvider.GetGreeting(Properties.Settings.Default.CustomerID, greetingID); if (greeting != null) { // Get the greeting for our specified language WOSI.CallButler.Data.CallButlerDataset.LocalizedGreetingsRow localizedGreeting = dataProvider.GetLocalizedGreeting(Properties.Settings.Default.CustomerID, greetingID, languageID); if (localizedGreeting == null) { // If the greeting doesn't exist in the current language, try using the default language localizedGreeting = dataProvider.GetLocalizedGreeting(Properties.Settings.Default.CustomerID, greetingID, Properties.Settings.Default.DefaultLanguage); if (localizedGreeting == null) { // If the greeting doesn't exist in the default language, heck just return the first one that exists WOSI.CallButler.Data.CallButlerDataset.LocalizedGreetingsRow[] localizedGreetings = greeting.GetLocalizedGreetingsRows(); if (localizedGreetings.Length > 0) { localizedGreeting = localizedGreetings[0]; } } } if (localizedGreeting != null) { // Determine how we should play this greeting WOSI.CallButler.Data.GreetingType greetingType = (WOSI.CallButler.Data.GreetingType)localizedGreeting.Type; switch (greetingType) { case WOSI.CallButler.Data.GreetingType.SoundGreeting: // Create our sound file path string soundFilePath = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.GreetingSoundRootDirectory) + "\\" + localizedGreeting.LanguageID + "\\" + greetingID.ToString() + ".snd"; if (File.Exists(soundFilePath)) { telecomProvider.PlaySound(tsInterface.LineNumber, soundFilePath, false); LoggingService.AddLogEntry(LogLevel.Extended, "(Line " + tsInterface.LineNumber + ") Playing sound at " + soundFilePath, false); } else { tsInterface.IMLInterpreter.SignalEventCallback(eventToken); } break; case WOSI.CallButler.Data.GreetingType.TextGreeting: // Speak our text string textToSpeak = tsInterface.IMLInterpreter.ParseVariableTokens(localizedGreeting.Data); // Take out any XML if (!WOSI.Utilities.StringUtils.IsWellFormedXml(textToSpeak)) { textToSpeak = WOSI.Utilities.StringUtils.XmlEncodeString(textToSpeak); } if (textToSpeak.Length > 0) { if (!localizedGreeting.IsVoiceNull() && localizedGreeting.Voice.Length > 0) { textToSpeak = "<voice required=\"Name=" + localizedGreeting.Voice + "\">" + textToSpeak + "</voice>"; } else if (Properties.Settings.Default.DefaultTTSVoice != null && Properties.Settings.Default.DefaultTTSVoice.Length > 0) { textToSpeak = "<voice required=\"Name=" + Properties.Settings.Default.DefaultTTSVoice + "\">" + textToSpeak + "</voice>"; } telecomProvider.SpeakText(tsInterface.LineNumber, textToSpeak); LoggingService.AddLogEntry(LogLevel.Extended, "(Line " + tsInterface.LineNumber + ") Speaking '" + textToSpeak + "'", false); } else { tsInterface.IMLInterpreter.SignalEventCallback(eventToken); } break; } } else { // If no greeting is found in the right language, tell the interpreter to move on tsInterface.IMLInterpreter.SignalEventCallback(eventToken); } } // If the greeting isn't found, tell the interpreter to go on else { tsInterface.IMLInterpreter.SignalEventCallback(eventToken); } break; } } else { OnExternalCommand(command, commandData, eventToken, tsInterface, telecomProvider, dataProvider); if (linkedScriptProcessor != null) { linkedScriptProcessor.OnLinkedExternalCommand(command, commandData, eventToken, tsInterface, telecomProvider, dataProvider); } } }
public static bool ProcessPersonalizedGreeting(WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider, ref WOSI.IVR.IML.Classes.ScriptPage scriptPage, int customerID, string callerDisplayName, string callerPhoneNumber, string callerHost, string dialedPhoneNumber) { // Loop through our personalized greetings and see if we can find one that matches our caller WOSI.CallButler.Data.CallButlerDataset.PersonalizedGreetingsDataTable personalGreetings = dataProvider.GetPersonalizedGreetings(customerID); WOSI.CallButler.Data.CallButlerDataset.PersonalizedGreetingsRow personalizedGreeting = null; foreach (WOSI.CallButler.Data.CallButlerDataset.PersonalizedGreetingsRow pgRow in personalGreetings) { string matchExpression = ""; // Try our dialed number first if (pgRow.DialedUsername.Length > 0) { if (!pgRow.UseRegex) { matchExpression = pgRow.DialedUsername.Replace("*", ".*"); } else { matchExpression = pgRow.DialedUsername; } if (Regex.IsMatch(dialedPhoneNumber, matchExpression, RegexOptions.IgnoreCase)) { personalizedGreeting = pgRow; break; } } // Next try our caller username/phone number if (pgRow.CallerUsername.Length > 0) { if (!pgRow.UseRegex) { matchExpression = pgRow.CallerUsername.Replace("*", ".*"); } else { matchExpression = pgRow.CallerUsername; } // First find by the caller number if (Regex.IsMatch(callerPhoneNumber, matchExpression, RegexOptions.IgnoreCase)) { personalizedGreeting = pgRow; break; } } // Next try the host if (pgRow.CallerHost.Length > 0) { if (!pgRow.UseRegex) { matchExpression = pgRow.CallerHost.Replace("*", ".*"); } else { matchExpression = pgRow.CallerHost; } if (Regex.IsMatch(callerHost, matchExpression, RegexOptions.IgnoreCase)) { personalizedGreeting = pgRow; break; } } // Next try the caller id/name if (pgRow.CallerDisplayName.Length > 0) { if (!pgRow.UseRegex) { matchExpression = pgRow.CallerDisplayName.Replace("*", ".*"); } else { matchExpression = pgRow.CallerDisplayName; } if (Regex.IsMatch(callerDisplayName, matchExpression, RegexOptions.IgnoreCase)) { personalizedGreeting = pgRow; break; } } } // If we have a personalized greeting, tell the interpreter to play it if (personalizedGreeting != null && (!personalizedGreeting.PlayOnce || (personalizedGreeting.PlayOnce && !personalizedGreeting.HasPlayed))) { scriptPage.Actions.Add(ScriptUtils.CreateGreetingExternalAction(personalizedGreeting.PersonalizedGreetingID)); switch (personalizedGreeting.Type) { case (short)WOSI.CallButler.Data.PersonalizedGreetingType.CustomScript: GotoPage gotoCustomScript = new GotoPage(); gotoCustomScript.Location = personalizedGreeting.Data; scriptPage.Actions.Add(gotoCustomScript); break; case (short)WOSI.CallButler.Data.PersonalizedGreetingType.Hangup: scriptPage.Actions.Add(new HangupCall()); break; case (short)WOSI.CallButler.Data.PersonalizedGreetingType.SendToExtension: // Get the proper extension WOSI.CallButler.Data.CallButlerDataset.ExtensionsRow extension = dataProvider.GetExtension(customerID, new Guid(personalizedGreeting.Data)); if (extension != null) { TransferCall transferCall = new TransferCall(); transferCall.TransferTo = extension.ExtensionNumber.ToString(); transferCall.IsExtension = true; scriptPage.Actions.Add(transferCall); } break; case (short)WOSI.CallButler.Data.PersonalizedGreetingType.Module: ExternalAction moduleAction = new ExternalAction(); moduleAction.Async = false; moduleAction.Action = BaseExternalCommands.CALLBUTLERINTERNAL_StartAddonModule.ToString(); moduleAction.ParameterData = personalizedGreeting.Data; scriptPage.Actions.Add(moduleAction); break; } if (personalizedGreeting.PlayOnce) { personalizedGreeting.HasPlayed = true; dataProvider.PersistPersonalizedGreeting(personalizedGreeting); } return(true); } else { return(false); } }
protected override void OnExternalCommand(string command, string commandData, string eventToken, TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { // Parse out our external event action if (Enum.IsDefined(typeof(TransferConferenceParticipantExternalCommands), command)) { TransferConferenceParticipantExternalCommands externalCommand = WOSI.Utilities.EnumUtils <TransferConferenceParticipantExternalCommands> .Parse(command); switch (externalCommand) { case TransferConferenceParticipantExternalCommands.CALLBUTLERINTERNAL_EndConference: telecomProvider.EndConference(conferenceID, true); break; case TransferConferenceParticipantExternalCommands.CALLBUTLERINTERNAL_MainMenu: break; } } tsInterface.IMLInterpreter.SignalEventCallback(eventToken); }
protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { tsInterface.IMLInterpreter.CallerDisplayName = string.Format("Calling {0}", numberToDial); tsInterface.IMLInterpreter.CallerHost = ""; tsInterface.IMLInterpreter.CallerUsername = ""; tsInterface.IMLInterpreter.DialedHost = ""; tsInterface.IMLInterpreter.DialedUsername = ""; string click2CallScriptLocation = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory) + "\\Click2Call Handler.xml"; if (System.IO.File.Exists(click2CallScriptLocation)) { IMLScript imlScript = IMLScript.OpenScript(click2CallScriptLocation); tsInterface.IMLInterpreter.StartScript(imlScript, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory)); } }
protected override void OnStartProcessing(TelecomScriptInterface tsInterface, CallButler.Telecom.TelecomProviderBase telecomProvider, WOSI.CallButler.Data.DataProviders.CallButlerDataProviderBase dataProvider) { string callFlowScriptLocation = WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory) + "\\Call Flow.xml"; IMLScript imlScript = new IMLScript(); ScriptPage introPage = new ScriptPage(); introPage.ID = Guid.NewGuid().ToString(); if (Properties.Settings.Default.WelcomeGreetingDelay > 0) { Delay welcomeDelay = new Delay(); welcomeDelay.DelayTime = Properties.Settings.Default.WelcomeGreetingDelay.ToString(); introPage.Actions.Add(welcomeDelay); } /*if (LicenseService.IsTrialLicense()) * { * introPage.Actions.Add(ScriptCompilers.ScriptUtils.CreateExternalAction(ScriptCompilers.BaseExternalCommands.CALLBUTLERINTERNAL_PlayLicenseIntroGreeting.ToString(), "")); * }*/ ScriptCompilers.ScriptUtils.ProcessPersonalizedGreeting(dataProvider, ref introPage, Properties.Settings.Default.CustomerID, tsInterface.IMLInterpreter.CallerDisplayName, tsInterface.IMLInterpreter.CallerUsername, tsInterface.IMLInterpreter.CallerHost, tsInterface.IMLInterpreter.DialedUsername); if (File.Exists(callFlowScriptLocation)) { GotoPage gotoPage = new GotoPage(); gotoPage.Location = callFlowScriptLocation; introPage.Actions.Add(gotoPage); imlScript.Pages.Add(introPage); } tsInterface.IMLInterpreter.StartScript(imlScript, WOSI.Utilities.FileUtils.GetApplicationRelativePath(Properties.Settings.Default.SystemScriptsRootDirectory)); }