diff --git a/src/parse_events.c b/src/parse_events.c index ed6b322..f3c55d7 100644 --- a/src/parse_events.c +++ b/src/parse_events.c @@ -51,6 +51,7 @@ static s_methods_events _methods_events[] = { Event_QueueParams, "QueueParams", parse_event_queueparams }, { Event_QueueMember, "QueueMember", parse_event_queuemember }, { Event_Agents, "Agents", parse_event_agents }, + { Event_QueueMemberStatus, "QueueMemberStatus", parse_event_queuememberstatus }, {0} }; diff --git a/src/parse_events.h b/src/parse_events.h index 1d2d4cc..711e248 100644 --- a/src/parse_events.h +++ b/src/parse_events.h @@ -36,7 +36,8 @@ enum { Event_PeerStatus, Event_QueueParams, Event_QueueMember, - Event_Agents + Event_Agents, + Event_QueueMemberStatus }; diff --git a/src/queue/queue.c b/src/queue/queue.c index d9f2a4a..328ab6c 100644 --- a/src/queue/queue.c +++ b/src/queue/queue.c @@ -220,7 +220,7 @@ int parse_event_queuemember( EVENT *event, s_manager *smanager ){ agent = name + 6; ramal = get_peer_location( location, txt ); if(!ramal){ - _WARNING("Vazio state_interface = %s - FILE %s Line %d", state_interface, __FILE__, __LINE__ ); + _WARNING("Vazio state_interface = %s - FILE %s Line %d", location, __FILE__, __LINE__ ); goto fail; } @@ -229,7 +229,7 @@ int parse_event_queuemember( EVENT *event, s_manager *smanager ){ agent = NULL; ramal = get_peer_location( name, txt ); if(!ramal){ - _WARNING("Vazio state_interface = %s - FILE %s Line %d", state_interface, __FILE__, __LINE__ ); + _WARNING("Vazio state_interface = %s - FILE %s Line %d", name, __FILE__, __LINE__ ); goto fail; } } @@ -237,7 +237,7 @@ int parse_event_queuemember( EVENT *event, s_manager *smanager ){ agent = NULL; ramal = get_peer_location( name, txt ); if(!ramal){ - _WARNING("Vazio state_interface = %s - FILE %s Line %d", state_interface, __FILE__, __LINE__ ); + _WARNING("Vazio state_interface = %s - FILE %s Line %d", name, __FILE__, __LINE__ ); goto fail; } } @@ -346,7 +346,7 @@ fail: } -int parse_event_QueueMemberStatus( EVENT *event, s_manager *smanager ){ +int parse_event_queuememberstatus( EVENT *event, s_manager *smanager ){ /* Event: QueueMemberStatus * Queue: @@ -391,11 +391,146 @@ int parse_event_QueueMemberStatus( EVENT *event, s_manager *smanager ){ * 1 */ - const char *queue, *member_name, *interface, *member_static; - unsigned int _static, penalty, callstaken, lastcall, incall, status, paused, ringuse; + const char *agent, *ramal, *queue, *member_name, *interface, *member_static; + char txt[100]; + unsigned int _static, penalty, callstaken, lastcall, incall, status, paused; - state_interface = ami_get_value( smanager->ami, event->args, "StateInterface" ); + // nome fila + queue = ami_get_value( smanager->ami, event->args, "Queue" ); + if(!queue){ goto fail; } + + interface = ami_get_value( smanager->ami, event->args, "Interface" ); + if(!interface){ goto fail; } + + member_name = ami_get_value( smanager->ami, event->args, "MemberName" ); + if(!member_name){ goto fail; } + + if( strstr( member_name, "Agent" ) ){ + agent = member_name + 6; + ramal = get_peer_location( interface, txt ); + if(!ramal){ + _WARNING("Vazio state_interface = %s - FILE %s Line %d", interface, __FILE__, __LINE__ ); + goto fail; + } + + } + else if( strstr( member_name, "SIP" ) ){ + agent = NULL; + ramal = get_peer_location( member_name, txt ); + if(!ramal){ + _WARNING("Vazio state_interface = %s - FILE %s Line %d", member_name, __FILE__, __LINE__ ); + goto fail; + } + } + else if( strstr( member_name, "IAX" ) ){ + agent = NULL; + ramal = get_peer_location( member_name, txt ); + if(!ramal){ + _WARNING("Vazio state_interface = %s - FILE %s Line %d", member_name, __FILE__, __LINE__ ); + goto fail; + } + } + else{ + goto fail; + } + + // membro estático, dinâmico + member_static = ami_get_value( smanager->ami, event->args, "Membership" ); + if(!member_static){ goto fail;} + _static = atoi(member_static); + if( !strcasecmp_n( member_static, "static" ) ){ + _static = 1; + } else if( !strcasecmp_n( member_static, "dynamic" ) ){ + _static = 0; + } else{ + goto fail; + } + + penalty = atoi(ami_get_value( smanager->ami, event->args, "Penalty" )); + + callstaken = atoi(ami_get_value( smanager->ami, event->args, "CallsTaken" )); + + lastcall = atoi(ami_get_value( smanager->ami, event->args, "LastCall" )); + + incall = atoi(ami_get_value( smanager->ami, event->args, "InCall" )); + + status = atoi(ami_get_value( smanager->ami, event->args, "Status" )); + + paused = atoi(ami_get_value( smanager->ami, event->args, "Paused" )); + + { + struct s_table_queue_member *table_queue_member = get_queue_member_db( Select_queuemember, ramal, queue ); + if( table_queue_member ){ + if(_static != table_queue_member->_static || + penalty != table_queue_member->penalty || + callstaken != table_queue_member->calls_taken || + lastcall != table_queue_member->last_call || + incall != table_queue_member->in_call || + status != table_queue_member->status || + paused != table_queue_member->paused ) { + if( update_queue_member_db( Update_queuemember, agent, _static, penalty, callstaken, lastcall, incall, status, paused, table_queue_member->queue_member_id ) == -1 ){ + goto fail; + } + } + } + else{ + insert_queue_member_db( Insert_queuemember, queue, ramal, agent, _static, penalty, callstaken, lastcall, incall, status, paused ); + } + } + + { + struct s_queue_member *member = get_queue_member_name( ramal, queue ); + /* char *queue_name; + * int _static; + * int calls_taken; + * int last_call; + * int in_call; + * int status; + * int paused; + */ + if(member){ + if( strcasecmp( queue, member->queue_name )){ + free( member->queue_name ); + newstrncpy( &member->queue_name, queue); + } + else if( member->_static != _static ){ + member->_static = _static; + } + else if( member->calls_taken != callstaken ){ + member->calls_taken = callstaken; + } + else if( member->last_call != lastcall){ + member->last_call = lastcall; + } + else if( member->in_call != incall ){ + member->in_call = incall; + } + else if(member->status != status ){ + member->status = status; + } + else if(member->paused != paused){ + member->paused = paused; + } + } + else { + member = create_queue_member( ); + newstrncpy( &member->queue_name, queue ); + member->_static = _static; + member->penalty = penalty; + member->calls_taken = callstaken; + member->last_call = lastcall; + member->in_call = incall; + member->status = status; + member->paused = paused; + } + + } + + return 1; + +fail: + return -1; } diff --git a/src/queue/queue.h b/src/queue/queue.h index 23d578f..c485541 100644 --- a/src/queue/queue.h +++ b/src/queue/queue.h @@ -61,9 +61,10 @@ struct s_table_queue_member { int parse_event_queueparams( EVENT *event, s_manager *smanager ); int parse_event_queuemember( EVENT *event, s_manager *smanager ); -int add_table_queue( struct s_table_queue **D, struct s_table_queue *next ); +int parse_event_queuememberstatus( EVENT *event, s_manager *smanager ); +int add_table_queue( struct s_table_queue **D, struct s_table_queue *next ); int free_table_queue(struct s_table_queue **D); struct s_table_queue *get_queueparams_db( stmt_t type_stmt, const char *queue_name ); int update_queueparams_db(stmt_t type_stmt, const char *strategy, unsigned long long int i_holdtime,