muc.vala
changeset 9 d3260253f0bd
parent 3 dd7a02c6d476
child 11 0f0cf428409f
equal deleted inserted replaced
8:dfd274c668f9 9:d3260253f0bd
    47 
    47 
    48     public class Occupant : Object {
    48     public class Occupant : Object {
    49         public weak Conference conference;
    49         public weak Conference conference;
    50         public string nick;
    50         public string nick;
    51         public string real_jid;
    51         public string real_jid;
       
    52         public string status;
    52         public Affiliation affil;
    53         public Affiliation affil;
    53         public Role role;
    54         public Role role;
    54         public bool isme;
    55         public bool isme;
    55     }
    56     }
    56 
    57 
    62         DISCONNECTED
    63         DISCONNECTED
    63     }
    64     }
    64 
    65 
    65     public signal void state_changed(Conference conf, State old_state, State new_state, string description);
    66     public signal void state_changed(Conference conf, State old_state, State new_state, string description);
    66     public signal void on_join(Conference conf, Occupant occupant);
    67     public signal void on_join(Conference conf, Occupant occupant);
    67     public signal void on_part(Conference conf, Occupant occupant);
    68     public signal void on_part(Conference conf, Occupant occupant, string? status);
    68     public signal void on_role(Conference conf, Occupant occupant, Role prev);
    69     public signal void on_role(Conference conf, Occupant occupant, Role prev);
    69     public signal void on_affil(Conference conf, Occupant occupant, Affiliation prev);
    70     public signal void on_affil(Conference conf, Occupant occupant, Affiliation prev);
    70     public signal void on_nick(Conference conf, Occupant occupant, string prev);
    71     public signal void on_nick(Conference conf, Occupant occupant, string prev);
    71     public signal void on_message(Conference conf, Occupant? occupant, Lm.MessageNode message, string? body);
    72     public signal void on_message(Conference conf, Occupant? occupant, Lm.MessageNode message, string? body);
    72     public signal void on_subject(Conference conf, Occupant? occupant);
    73     public signal void on_subject(Conference conf, Occupant? occupant);
   168                                 log("Muc", LogLevelFlags.LEVEL_INFO, "Joined a room which I was already in: %s", from[0]);
   169                                 log("Muc", LogLevelFlags.LEVEL_INFO, "Joined a room which I was already in: %s", from[0]);
   169 
   170 
   170                             if (occupant != null) {
   171                             if (occupant != null) {
   171                                 if (role == Role.NONE) {
   172                                 if (role == Role.NONE) {
   172                                     occupants.unset(from[1]);
   173                                     occupants.unset(from[1]);
       
   174                                     var status_child = node.get_child("status");
   173                                     log("Muc", LogLevelFlags.LEVEL_INFO, "MUC<%s> %s has parted.", this.jid, from[1]);
   175                                     log("Muc", LogLevelFlags.LEVEL_INFO, "MUC<%s> %s has parted.", this.jid, from[1]);
   174                                     module.on_part(this, occupant);
   176                                     module.on_part(this, occupant, (status_child!=null) ? status_child.get_value() : null);
   175                                     if (occupant.isme) {
   177                                     if (occupant.isme) {
   176                                         _change_state(State.DISCONNECTED, "we became unavailable");
   178                                         _change_state(State.DISCONNECTED, "we became unavailable");
   177                                     }
   179                                     }
   178                                 } else {
   180                                 } else {
   179                                     if (affil != occupant.affil) {
   181                                     if (affil != occupant.affil) {
   192                                         occupant.nick = prs_nick;
   194                                         occupant.nick = prs_nick;
   193                                         module.on_nick(this, occupant, from[1]);
   195                                         module.on_nick(this, occupant, from[1]);
   194                                     }
   196                                     }
   195                                 }
   197                                 }
   196                             } else {
   198                             } else {
   197                                 assert( role!= Role.NONE);
   199                                 if( role!= Role.NONE) {
   198                                 occupant = new Occupant();
   200                                     occupant = new Occupant();
   199                                 occupant.role = role;
   201                                     occupant.role = role;
   200                                 occupant.affil = affil;
   202                                     occupant.affil = affil;
   201                                 occupant.nick = from[1];
   203                                     occupant.nick = from[1];
   202                                 occupants[from[1]] = occupant;
   204                                     occupants[from[1]] = occupant;
   203                                 occupant.isme = statuses.contains(110);
   205                                     occupant.isme = statuses.contains(110);
   204                                 log("Muc", LogLevelFlags.LEVEL_INFO, "MUC<%s> %s has joined as %s/%s.", this.jid, from[1], affil.to_string(), role.to_string());
   206                                     log("Muc", LogLevelFlags.LEVEL_INFO, "MUC<%s> %s has joined as %s/%s.", this.jid, from[1], affil.to_string(), role.to_string());
   205                                 if (statuses.contains(110)) {
   207                                     if (statuses.contains(110)) {
   206                                     this.nick = from[1];
   208                                         this.nick = from[1];
   207                                     _change_state(State.CONNECTED, "got own presence. we are "+this.nick);
   209                                         _change_state(State.CONNECTED, "got own presence. we are "+this.nick);
   208                                 }
   210                                     }
   209                                 module.on_join(this, occupant);
   211                                     module.on_join(this, occupant);
       
   212                                 } else
       
   213                                     log("Muc", LogLevelFlags.LEVEL_WARNING, "Got NONE role for new participant. Maybe we are reconnecting.");
   210                             }
   214                             }
   211                             
   215                             
   212                             stdout.printf("User list: ");
   216                             stdout.printf("User list: ");
   213                             foreach (var a in occupants.keys)
   217                             foreach (var a in occupants.keys)
   214                                 stdout.printf("%s <%s,%s>, ", a, occupants[a].affil.to_string(), occupants[a].role.to_string());
   218                                 stdout.printf("%s <%s,%s>, ", a, occupants[a].affil.to_string(), occupants[a].role.to_string());