Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

117
LINES

< > BotCompany Repo | #1006632 // class MultiPort (multi-port as object)

JavaX fragment (include)

1  
sclass MultiPort {
2  
  sclass Resp {
3  
    long virtualPort;
4  
    S botName;
5  
    O responder;
6  
  }
7  
  
8  
  new List<Resp> responders;
9  
  Android3 android;
10  
  long nextVirtualPort = 1;
11  
  
12  
  *() {
13  
    synchronized(getJavaX()) {
14  
      if (!getMultiPorts().isEmpty()) return;
15  
      if (!(Boolean) call(getJavaX(), "addMultiPort", this)) {
16  
        // XXX - hope this still works
17  
        Android3 android = new Android3("Multi-Port at " + getVMID() + ".");
18  
        android.useMultiPort = false;
19  
        android.incomingSilent = true;
20  
        android.console = false;
21  
        android.daemon = true;
22  
        makeAndroid3(android);
23  
      }
24  
    }
25  
    //print("Dynamic Multi-Port registered with VM. Now " + l(getMultiPorts()) + " multi-port(s).");
26  
  }
27  
  
28  
  S answer(S s) {
29  
    new Matches m;
30  
    
31  
    if (match3("list bots", s, m)) {
32  
      ret structure(listBotsWithPort());
33  
    }
34  
    
35  
    if (match3("has bot *", s, m)) {
36  
      S name = m.unq(0);
37  
      ret findResponder(name) != null ? "yes" : "no";
38  
    }
39  
    
40  
    if (match3("silent", s, m)) {
41  
      android.incomingSilent = true;
42  
      ret "OK.";
43  
    }
44  
    
45  
    if (match3("unsilent", s, m)) {
46  
      android.incomingSilent = false;
47  
      ret "OK.";
48  
    }
49  
    
50  
    if (match3("please forward to bot *: *", s, m)) {
51  
      S bot = unquote(m.m[0]);
52  
      S line = unquote(m.m[1]);
53  
      O responder = findResponder(bot);
54  
      if (responder == null)
55  
        ret "Error: bot not found";
56  
      else
57  
        ret (S) call(responder, "answer", line, litlist(s));
58  
    }
59  
    
60  
    ret null;
61  
  }
62  
  
63  
  synchronized L<S> listBots() {
64  
    new L<S> list;
65  
    for (Resp r : responders)
66  
      list.add(r.botName);
67  
    ret list;
68  
  }
69  
  
70  
  synchronized Map<Long,S> listBotsWithPort() {
71  
    new Map<Long,S> map;
72  
    for (Resp r : responders)
73  
      map.put(r.virtualPort, r.botName);
74  
    ret map;
75  
  }
76  
  
77  
  synchronized O findResponder(S botName) {
78  
    if (isInteger(botName)) {
79  
      long vport = parseLong(botName);
80  
      for (Resp r : responders)
81  
        if (r.virtualPort == vport)
82  
          ret r.responder;
83  
    } else {
84  
      for (Resp r : responders)
85  
        if (startsWithIgnoreCase(r.botName, botName))
86  
          ret r.responder;
87  
    }
88  
    ret null;
89  
  }
90  
      
91  
  synchronized long addResponder(S botName, O responder) {
92  
    new Resp r;
93  
    r.virtualPort = nextVirtualPort++;
94  
    r.botName = botName;
95  
    r.responder = responder;
96  
    responders.add(r);
97  
    ret r.virtualPort;
98  
  }
99  
  
100  
  synchronized void removeResponder(O responder) {
101  
    for (int i = 0; i < l(responders); i++)
102  
      if (responders.get(i).responder == responder) {
103  
        //print("Responder removed.");
104  
        responders.remove(i);
105  
        ret;
106  
      }
107  
  }
108  
  
109  
  synchronized void removePort(long virtualPort) {
110  
    for (int i = 0; i < l(responders); i++)
111  
      if (responders.get(i).virtualPort == virtualPort) {
112  
        //print("Virtual port " + virtualPort + " removed.");
113  
        responders.remove(i);
114  
        ret;
115  
      }
116  
  }
117  
}

Author comment

Began life as a copy of #1001672

download  show line numbers  debug dex  old transpilations   

Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt

No comments. add comment

Snippet ID: #1006632
Snippet name: class MultiPort (multi-port as object)
Eternal ID of this version: #1006632/2
Text MD5: a61ea907ed3de94d63d00ef0b6ca94e3
Author: stefan
Category: javax / core
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2017-07-30 17:05:11
Source code size: 3032 bytes / 117 lines
Pitched / IR pitched: No / No
Views / Downloads: 445 / 1229
Version history: 1 change(s)
Referenced in: [show references]