Die Call Script sind ein mächtiges Werkzeug der 3CX und es werden auch diverse Call Scripts aus dem Store angeboten. Leider ist das Erstellen von eigenen Scripts nicht ganz einfach. Wir haben aber regelmäßig Anfragen für zwei Aufgabenstellungen, für die wir Call Scripts erstellt haben, die wir teilen wollen, um das Leben allen mit ähnlichen Herausforderungen leichter zu machen.
Call Script zum An- und Abmelden an Signalisierungsgruppen
Es gibt immer wieder Kunden, für die eine Warteschleife nicht das passende Instrument ist, sondern Signalisierungsgruppen. Hier fehlt aber die Dynamik. Wir haben zum Beispiel öfters den Fall, dass eine Türsprechstelle eine Signalisierungsgruppe anklingeln soll, in der entsprechende Mitarbeiter sind. Nun kommt es aber vor, dass durch Urlaub, Krankheit oder andere Vorfälle keiner der Mitarbeiter erreichbar ist. Natürlich kann ein Benutzer mit entsprechenden Rechten dann die Mitglieder anpassen. Einfacher wäre es aber, wenn man sich per Funktionscode in eine Signalisierungsgruppe ein- und ausbuchen könnte. Hierfür haben wir ein kleines Call Script geschrieben. Es sind eigentlich zwei Call Scripts, eines zum Einbuchen und eines zum Ausbuchen.
Das ist der Call Script Code um sich in Signalisierungsgruppen einzubuchen:
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using CallFlow;
namespace dummy
{
public class LoginToRinggroup : ScriptBase<LoginToRinggroup>
{
PhoneSystem ps = null;
System.Collections.Generic.List<TCX.Configuration.DN> rg_new = null;
public override async Task<bool> StartAsync()
{
if (MyCall.Caller.DN is Extension ext
&& MyCall.ReferredByDN is not DN)
{
rg_new = new System.Collections.Generic.List();
ps = MyCall.PS as PhoneSystem;
var rgs = ps.GetRingGroups();
var rg_number = "800"; // Hier die Nummer der Signalisierungsgruppe eintragen
foreach(var rg in rgs){
if(rg.Number == rg_number){
var ismember = false;
foreach(var rg_member in rg.Members){
if(rg_member.Number == ext.Number){ismember = true;}
rg_new.Add(rg_member);
}
if(ismember == false){
rg_new.Add(ext);
}
rg.Members = rg_new.ToArray();
rg.Save();
}
}
MyCall.Info($"Extension {ext.Number} has been logged in to ringgroup {rg_number}");
try
{
await MyCall.PlayPrompt(null, new [] {"/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/Callflows/ringgroupi/converted_NB_an_SG_angemeldet.wav"}, PlayPromptOptions.Blocked);
}
catch(Exception ex)
{
}
return true;
}
return false;
}
}
}
Zu beachten ist, dass man in Zeile 19 die Nummer der Signalisierungsgruppe entsprechend ändert. Und in Zeile 41 den Pfad zur entsprechenden Ansage.
Und so richtet man das Call Script in der 3CX ein:
Öffnen Sie den Admin-Bereich der 3CX und rufen Sie das Call Script-Menü auf und erstellen Sie ein benutzerdefiniertes Call Script.
Legen Sie einen Namen (1) fest, wählen Sie als Typ "Wenn Nutzer einen Wählcode wählt" (2) aus und legen Sie den Wählcode (3) fest. Unsere Empfehulung ist die Nummer der Signalisierungsgruppe zu nehmen und *1 anzuhängen für das Anmelden und *0 für das Abmelden.
Laden Sie die Ansage-Datei hoch (1) und fügen Sie den Code in den Codebereich (2) ein.
Der Pfad zur hochgeladenen Ansage setzt sich wie folgt zusammen:
/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/Callflows/NAMEDESCALLSCRIPTS/NAMEDERDATEI
In diesem Beispiel also /var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/Callflows/ringgrouplogin/converted_NB_an_SG_angemeldet.wav
Das ganze Prozedere müssen wir nun noch für das Abmelde-Call Script durchführen. Der Code des Call Scripts zum Abmelden aus einer Signalsierungsgruppe ist folgdender:
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using CallFlow;
namespace dummy
{
public class LogoffFromRinggroup : ScriptBase<LogoffFromRinggroup>
{
PhoneSystem ps = null;
System.Collections.Generic.List<TCX.Configuration.DN> rg_new = null;
public override async Task<bool> StartAsync()
{
if (MyCall.Caller.DN is Extension ext
&& MyCall.ReferredByDN is not DN)
{
rg_new = new System.Collections.Generic.List();
ps = MyCall.PS as PhoneSystem;
var rgs = ps.GetRingGroups();
var rg_number = "800"; // Hier die Nummer der Signalisierungsgruppe eintragen
foreach(var rg in rgs){
if(rg.Number == rg_number){
foreach(var rg_member in rg.Members){
if(rg_member.Number != ext.Number){
rg_new.Add(rg_member);
}
}
rg.Members = rg_new.ToArray();
rg.Save();
}
}
MyCall.Info($"Extension {ext.Number} has been logged off from ring group {rg_number}");
try
{
await MyCall.PlayPrompt(null, new [] {"/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/Callflows/ringgroupo/converted_NB_von_SG_abgemeldet.wav"}, PlayPromptOptions.ResetBufferAtStart|PlayPromptOptions.CancelPlaybackAtFirstChar);
}
catch(Exception ex)
{
}
return true;
}
return false;
}
}
}
</logofffromringgroup\>
Beide Audiodateien sind mit Vidnoz generiert worden. Wir stellen sie hier zum Download bereit.
Call Script für Abspielen einer Ankündigung vor dem Routing zum eigentlichen Ziel
Auch dieses Script entstand aus einer Kundenanforderung. Der Wunsch war eine Ansage bei eingehenden Anrufen, dass das Gespräch aufgezeichnet wird und dann sollte an das eigentliche Ziel geroutet werden soll. Nachfolgend der Code:
#nullable disable
using CallFlow;
using System;
using System.Threading;
using System.Linq;
using System.Threading.Tasks;
using TCX.Configuration;
using TCX.PBXAPI;
using System.Collections.Generic;
namespace dummy
{
//this handler plays prompt as specified for destination
public class PlayPromptBeforeRouting : ScriptBase<PlayPromptBeforeRouting>
{
PhoneSystem ps = null;
public override async Task<bool> StartAsync()
{
ps = MyCall.PS as PhoneSystem;
if(MyCall.Caller.DN is ExternalLine externalLine && MyCall.IsInbound) //only from trunk
{
await MyCall.AssureMedia().ContinueWith(x =>
MyCall.PlayPrompt(null, new [] {"/var/lib/3cxpbx/Instance1/Data/Ivr/Prompts/Callflows/test/converted_anruf_wird_aufgezeichnet.wav"}, PlayPromptOptions.Blocked)
).Unwrap();
await MyCall.AssureMedia().ContinueWith(x =>
MyCall.SetBackgroundAudio(true, new string[] { ps.GetParameterValue("MUSICONHOLDFILE") })
);
}
return false;//we always return false to continue default trunk routing procedure.
}
}
}
Bei diesem Call Script muss im Übrigen als Typ "Beim Empfangen eines Anrufs auf einem Trunk" und der entsprechende Trunk ausgewählt werden.
Fragen und Feedback zu diesen Call Scripts bitte im 3CX Forum stellen.