/** * */ package net.combase.desktopcrm.data; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.HttpClientBuilder; import org.asteriskjava.live.AsteriskChannel; import org.asteriskjava.live.AsteriskServer; import org.asteriskjava.live.AsteriskServerListener; import org.asteriskjava.live.CallerId; import org.asteriskjava.live.DefaultAsteriskServer; import org.asteriskjava.live.Extension; import org.asteriskjava.live.ManagerCommunicationException; import org.asteriskjava.live.MeetMeUser; import net.combase.desktopcrm.domain.Settings; /** * yealink call url: * http://10.1.0.11/cgi-bin/ConfigManApp.com?number=702-927-6689 * * @author "Till Freier" */ public final class AsteriskManager { public interface AsteriskCallEventListener { public void incomingCall(String number); public void outgoingCall(String number); } private static AsteriskServer asteriskServer = null; private static String extension = ""; private static List<AsteriskCallEventListener> listeners = new ArrayList<>(); private AsteriskManager() { super(); } public static void dial(String number) { final Settings settings = DataStoreManager.getSettings(); String dialUrl = settings.getDialUrl(); if (dialUrl == null || dialUrl.trim().isEmpty()) { System.out.println("no dial url configured"); return; } number = number.replaceAll("[^0-9]*", ""); String urlStr = dialUrl.replaceAll("\\$0", number); System.out.println("dial url: " + urlStr); try { HttpGet get = new HttpGet(urlStr); CredentialsProvider provider = new BasicCredentialsProvider(); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("admin", "admin"); provider.setCredentials(AuthScope.ANY, credentials); HttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(provider).build(); HttpResponse response = client.execute(get); int statusCode = response.getStatusLine().getStatusCode(); System.out.println("url call status code: " + statusCode); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static boolean setup() { final Settings settings = DataStoreManager.getSettings(); final String hostname = settings.getAsteriskHost(); final String username = settings.getAsteriskUser(); final String password = settings.getAsteriskPassword(); extension = settings.getAsteriskExtension(); if (hostname == null || hostname.trim().isEmpty() || username == null || username.trim().isEmpty() || password == null || password.trim().isEmpty()) return false; if (asteriskServer != null) asteriskServer.shutdown(); asteriskServer = new DefaultAsteriskServer(hostname, username, password); try { asteriskServer.addAsteriskServerListener(new AsteriskServerListener() { @Override public void onNewMeetMeUser(MeetMeUser user) { // no conference call integration at this time } @Override public void onNewAsteriskChannel(AsteriskChannel channel) { AsteriskManager.onNewAsteriskChannel(channel); } }); } catch (ManagerCommunicationException e) { e.printStackTrace(); asteriskServer = null; return false; } return true; } private static void onNewAsteriskChannel(AsteriskChannel channel) { AsteriskManager.onChannelPropertyChange(channel); channel.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { Object source = evt.getSource(); if (source instanceof AsteriskChannel) { AsteriskChannel ch = (AsteriskChannel)source; AsteriskManager.onChannelPropertyChange(ch); } } }); } private static void onChannelPropertyChange(AsteriskChannel channel) { Extension ext = channel.getCurrentExtension(); CallerId callerId = channel.getCallerId(); if (ext == null || callerId == null || ext.getExtension() == null || callerId.getNumber() == null) return; String number = callerId.getNumber(); if (ext.getExtension().equals(extension)) { System.out.println("call from " + number); if (isValid(number)) for (AsteriskCallEventListener l : listeners) { l.incomingCall(number); } } else if (number.equals(extension)) { System.out.println("call to " + ext.getExtension()); if (isValid(ext.getExtension())) for (AsteriskCallEventListener l : listeners) { l.outgoingCall(ext.getExtension()); } } } private static boolean isValid(String number) { if (number != null && number.matches("^[0-9]*$") && number.length() > 5) return true; System.out.println("ignore call " + number); return false; } public static void addListener(AsteriskCallEventListener l) { listeners.add(l); } public static void removeListener(AsteriskCallEventListener l) { listeners.remove(l); } }