chatgraph 0.4.2__py3-none-any.whl → 0.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of chatgraph might be problematic. Click here for more details.

@@ -1,27 +1,18 @@
1
1
  import json
2
+ import asyncio
2
3
  from logging import debug, info
3
4
  import os
4
- import pika
5
+ import aio_pika
5
6
  from typing import Callable
6
7
  from ..auth.credentials import Credential
7
- from ..types.request_types import UserCall, UserState
8
+ from ..types.request_types import UserCall, UserState, ChatID
8
9
  from rich.console import Console
9
10
  from rich.table import Table
10
11
  from rich.text import Text
11
12
  from rich.panel import Panel
13
+ from urllib.parse import quote
12
14
 
13
15
  class MessageConsumer:
14
- """
15
- Implementação de MessageConsumer para consumir mensagens de uma fila RabbitMQ.
16
-
17
- Atributos:
18
- __virtual_host (str): O host virtual usado para a conexão RabbitMQ.
19
- __prefetch_count (int): O número de mensagens pré-carregadas que o consumidor pode processar.
20
- __queue_consume (str): O nome da fila de consumo.
21
- __amqp_url (str): A URL de conexão AMQP do RabbitMQ.
22
- __credentials (pika.PlainCredentials): Credenciais do RabbitMQ para autenticação.
23
- """
24
-
25
16
  def __init__(
26
17
  self,
27
18
  credential: Credential,
@@ -29,65 +20,36 @@ class MessageConsumer:
29
20
  grpc_uri: str,
30
21
  queue_consume: str,
31
22
  prefetch_count: int = 1,
32
- virtual_host: str = '/',
23
+ virtual_host: str = "/",
33
24
  ) -> None:
34
- """
35
- Inicializa o consumidor de mensagens RabbitMQ com as configurações fornecidas.
36
-
37
- Args:
38
- credential (Credential): Credenciais de autenticação para o RabbitMQ.
39
- amqp_url (str): A URL de conexão AMQP do RabbitMQ.
40
- queue_consume (str): O nome da fila de consumo.
41
- prefetch_count (int, opcional): O número de mensagens pré-carregadas. Padrão é 1.
42
- virtual_host (str, opcional): O host virtual do RabbitMQ. Padrão é '/'.
43
- """
44
25
  self.__virtual_host = virtual_host
45
26
  self.__prefetch_count = prefetch_count
46
27
  self.__queue_consume = queue_consume
47
28
  self.__amqp_url = amqp_url
48
29
  self.__grpc_uri = grpc_uri
49
- self.__credentials = pika.PlainCredentials(
50
- credential.username, credential.password
51
- )
30
+ self.__credentials = credential
52
31
 
53
32
  @classmethod
54
33
  def load_dotenv(
55
34
  cls,
56
- user_env: str = 'RABBIT_USER',
57
- pass_env: str = 'RABBIT_PASS',
58
- uri_env: str = 'RABBIT_URI',
59
- queue_env: str = 'RABBIT_QUEUE',
60
- prefetch_env: str = 'RABBIT_PREFETCH',
61
- vhost_env: str = 'RABBIT_VHOST',
62
- grpc_uri: str = 'GRPC_URI',
63
- ) -> 'MessageConsumer':
64
- """
65
- Carrega as configurações do RabbitMQ a partir de variáveis de ambiente e retorna uma instância de RabbitMessageConsumer.
66
-
67
- Args:
68
- user_env (str): Nome da variável de ambiente para o usuário do RabbitMQ. Padrão é 'RABBIT_USER'.
69
- pass_env (str): Nome da variável de ambiente para a senha do RabbitMQ. Padrão é 'RABBIT_PASS'.
70
- uri_env (str): Nome da variável de ambiente para a URL do RabbitMQ. Padrão é 'RABBIT_URI'.
71
- queue_env (str): Nome da variável de ambiente para a fila de consumo do RabbitMQ. Padrão é 'RABBIT_QUEUE'.
72
- prefetch_env (str): Nome da variável de ambiente para o prefetch count. Padrão é 'RABBIT_PREFETCH'.
73
- vhost_env (str): Nome da variável de ambiente para o host virtual do RabbitMQ. Padrão é 'RABBIT_VHOST'.
74
-
75
- Raises:
76
- ValueError: Se qualquer uma das variáveis de ambiente necessárias não estiver definida.
77
-
78
- Returns:
79
- RabbitMessageConsumer: Uma instância configurada do RabbitMessageConsumer.
80
- """
35
+ user_env: str = "RABBIT_USER",
36
+ pass_env: str = "RABBIT_PASS",
37
+ uri_env: str = "RABBIT_URI",
38
+ queue_env: str = "RABBIT_QUEUE",
39
+ prefetch_env: str = "RABBIT_PREFETCH",
40
+ vhost_env: str = "RABBIT_VHOST",
41
+ grpc_uri: str = "GRPC_URI",
42
+ ) -> "MessageConsumer":
81
43
  username = os.getenv(user_env)
82
44
  password = os.getenv(pass_env)
83
45
  url = os.getenv(uri_env)
84
46
  queue = os.getenv(queue_env)
85
47
  prefetch = os.getenv(prefetch_env, 1)
86
- vhost = os.getenv(vhost_env, '/')
48
+ vhost = os.getenv(vhost_env, "/")
87
49
  grpc = os.getenv(grpc_uri)
88
50
 
89
51
  if not username or not password or not url or not queue or not grpc:
90
- raise ValueError('Corrija as variáveis de ambiente!')
52
+ raise ValueError("Corrija as variáveis de ambiente!")
91
53
 
92
54
  return cls(
93
55
  credential=Credential(username=username, password=password),
@@ -98,106 +60,80 @@ class MessageConsumer:
98
60
  grpc_uri=grpc,
99
61
  )
100
62
 
101
- def start_consume(self, process_message: Callable) -> None:
102
- """
103
- Inicia o consumo de mensagens da fila RabbitMQ e processa cada mensagem usando a função fornecida.
104
-
105
- Args:
106
- process_message (Callable): Função de callback que processa cada mensagem recebida.
107
-
108
- Raises:
109
- pika.exceptions.StreamLostError: Se a conexão com o RabbitMQ for perdida, tentará reconectar automaticamente.
110
- """
63
+ async def start_consume(self, process_message: Callable):
111
64
  try:
112
- connection = pika.BlockingConnection(
113
- pika.ConnectionParameters(
114
- host=self.__amqp_url,
115
- virtual_host=self.__virtual_host,
116
- credentials=self.__credentials,
117
- )
118
- )
119
- channel = connection.channel()
120
-
121
- channel.basic_qos(prefetch_count=self.__prefetch_count)
122
- channel.basic_consume(
123
- queue=self.__queue_consume,
124
- on_message_callback=lambda c, m, p, b: self.on_request(
125
- c, m, p, b, process_message
126
- ),
127
- )
128
-
129
- info('[x] Server inicializado! Aguardando solicitações RPC')
130
- channel.start_consuming()
131
- except pika.exceptions.StreamLostError as e:
132
- debug(e)
133
- self.start_consume(process_message)
134
-
135
- def on_request(self, ch, method, props, body, process_message) -> None:
136
- """
137
- Processa uma mensagem recebida e publica a resposta de volta na fila especificada.
138
-
139
- Args:
140
- ch: Canal do RabbitMQ.
141
- method: Método de entrega do RabbitMQ.
142
- props: Propriedades da mensagem do RabbitMQ.
143
- body: Corpo da mensagem recebida.
144
- process_message (Callable): Função que processa a mensagem e retorna uma resposta.
145
- """
146
- message = body.decode()
147
- message_json = json.loads(message)
148
- pure_message = self.__transform_message(message_json)
149
- process_message(pure_message)
150
-
151
- ch.basic_ack(delivery_tag=method.delivery_tag)
65
+ user = quote(self.__credentials.username)
66
+ pwd = quote(self.__credentials.password)
67
+ vhost = quote(self.__virtual_host)
68
+ uri = self.__amqp_url
69
+ amqp_url = f"amqp://{user}:{pwd}@{uri}/{vhost}"
70
+ connection = await aio_pika.connect_robust(amqp_url)
71
+
72
+ async with connection:
73
+ channel = await connection.channel()
74
+ await channel.set_qos(prefetch_count=self.__prefetch_count)
75
+
76
+ try:
77
+ queue = await channel.get_queue(self.__queue_consume, ensure=True)
78
+ except aio_pika.exceptions.ChannelNotFoundEntity:
79
+ arguments = {
80
+ "x-dead-letter-exchange": "log_error", # Dead Letter Exchange
81
+ "x-expires": 86400000, # Expiração da fila (em milissegundos)
82
+ "x-message-ttl": 300000 # Tempo de vida das mensagens (em milissegundos)
83
+ }
84
+ queue = await channel.declare_queue(self.__queue_consume, durable=True, arguments=arguments)
85
+
86
+ info("[x] Server inicializado! Aguardando solicitações RPC")
87
+
88
+ async for message in queue:
89
+ async with message.process():
90
+ await self.on_request(message.body, process_message)
91
+ except Exception as e:
92
+ print(f"Erro durante o consumo de mensagens: {e}")
93
+ # Reiniciar a conexão em caso de falha
94
+ # await self.start_consume(process_message)
95
+
96
+ async def on_request(self, body: bytes, process_message: Callable):
97
+ try:
98
+ message = body.decode()
99
+ message_json = json.loads(message)
100
+ pure_message = self.__transform_message(message_json)
101
+ await process_message(pure_message)
102
+ except Exception as e:
103
+ print(f"Erro ao processar mensagem: {e}")
152
104
 
153
105
  def __transform_message(self, message: dict) -> UserCall:
154
- """
155
- Transforma o dicionário JSON recebido em uma instância de Message.
156
-
157
- Args:
158
- message (dict): Dicionário contendo os dados da mensagem.
106
+ user_state = message.get("user_state", {})
107
+ observation = user_state.get("observation", {})
108
+ if isinstance(observation, str):
109
+ observation = json.loads(observation)
159
110
 
160
- Returns:
161
- Message: Uma instância da classe Message com os dados extraídos do dicionário.
162
- """
163
-
164
- user_state = message.get('user_state', {})
165
- obs = user_state.get('obs', {})
166
- if isinstance(obs, str):
167
- obs = json.loads(obs)
168
-
169
- return UserCall(
170
- type=message.get('type', ''),
171
- text=message.get('text', ''),
111
+ usercall = UserCall(
172
112
  user_state=UserState(
173
- customer_id=user_state.get('customer_id', ''),
174
- menu=user_state.get('menu', ''),
175
- route=user_state.get('route', ''),
176
- lst_update=user_state.get('lst_update', ''),
177
- direction_in=user_state.get('direction_in', ''),
178
- voll_id=user_state.get('voll_id', ''),
179
- platform=user_state.get('platform', ''),
180
- obs=obs,
181
- protocol=user_state.get('protocol', ''),
113
+ chatID=ChatID(
114
+ user_id=user_state['chat_id'].get("user_id", ""),
115
+ company_id=user_state['chat_id'].get("company_id", ""),
116
+ ),
117
+ menu=user_state.get("menu", ""),
118
+ route=user_state.get("route", ""),
119
+ protocol=user_state.get("protocol", ""),
120
+ observation=observation,
182
121
  ),
183
- channel=message.get('channel', ''),
184
- customer_phone=message.get('customer_phone', ''),
185
- company_phone=message.get('company_phone', ''),
186
- status=message.get('status'),
122
+ type_message=message.get("type_message", ""),
123
+ content_message=message.get("content_message", ""),
187
124
  grpc_uri=self.__grpc_uri,
188
125
  )
126
+
127
+ return usercall
189
128
 
190
129
  def reprer(self):
191
130
  console = Console()
192
131
 
193
- # Título "ChatGraph" destacado em vermelho e negrito dentro de um painel
194
132
  title_text = Text("ChatGraph", style="bold red", justify="center")
195
133
  title_panel = Panel.fit(title_text, title=" ", border_style="bold red", padding=(1, 4))
196
134
 
197
- # Linha separadora com emojis
198
135
  separator = Text("🐇🐇🐇 RabbitMessageConsumer 📨📨📨", style="cyan", justify="center")
199
136
 
200
- # Criação da tabela com os atributos
201
137
  table = Table(show_header=True, header_style="bold magenta", title="RabbitMQ Consumer")
202
138
  table.add_column("Atributo", justify="center", style="cyan", no_wrap=True)
203
139
  table.add_column("Valor", justify="center", style="magenta")
@@ -207,9 +143,8 @@ class MessageConsumer:
207
143
  table.add_row("Queue Consume", self.__queue_consume)
208
144
  table.add_row("AMQP URL", self.__amqp_url)
209
145
  table.add_row("Username", self.__credentials.username)
210
- table.add_row("Password", "******") # Oculta a senha
146
+ table.add_row("Password", "******")
211
147
 
212
- # Imprime o título, separador e a tabela centralizada
213
148
  console.print(title_panel, justify="center")
214
149
  console.print(separator, justify="center")
215
150
  console.print(table, justify="center")
@@ -0,0 +1,127 @@
1
+ syntax = "proto3";
2
+
3
+ package chatbot;
4
+
5
+ option go_package = "./chatbot";
6
+
7
+ ///// Serviços de Estado do Usuário /////
8
+ service UserStateService {
9
+ rpc InsertUpdateUserState(UserState) returns (RequestStatus);
10
+ rpc DeleteUserState(ChatID) returns (RequestStatus);
11
+ rpc GetUserState(ChatID) returns (UserState);
12
+ rpc GetAllUserStates(Void) returns (UserStateList);
13
+ }
14
+
15
+ ///// Serviços de Mensagens /////
16
+ service SendMessage {
17
+ rpc SendMessage(Message) returns (RequestStatus);
18
+ }
19
+
20
+ ///// Serviços de Transfer /////
21
+ service Transfer {
22
+ rpc GetAllCampaigns(Void) returns (CampaignsList);
23
+ rpc GetCampaignID(CampaignName) returns (CampaignDetails);
24
+ rpc TransferToHuman(TransferToHumanRequest) returns (RequestStatus);
25
+ rpc TransferToMenu(TransferToMenuRequest) returns (RequestStatus);
26
+ }
27
+
28
+ ///// Serviços de EndChat /////
29
+ service EndChat {
30
+ rpc GetAllTabulations(Void) returns (TabulationsList);
31
+ rpc GetTabulationID(TabulationName) returns (TabulationDetails);
32
+ rpc EndChat(EndChatRequest) returns (RequestStatus);
33
+ }
34
+
35
+ ///// Mensagens Compartilhadas /////
36
+ message Void {}
37
+
38
+ message RequestStatus {
39
+ bool status = 1;
40
+ string message = 2;
41
+ }
42
+
43
+ message ChatID {
44
+ string user_id = 1;
45
+ string company_id = 2;
46
+ }
47
+ ///// Mensagens para Estado do Usuário /////
48
+ message UserState {
49
+ ChatID chat_id = 1;
50
+ string menu = 2;
51
+ string route = 3;
52
+ string protocol = 4;
53
+ string observation = 5;
54
+ }
55
+
56
+ message UserStateList {
57
+ repeated UserState user_states = 1;
58
+ }
59
+
60
+ ///// Mensagens para Serviços de Mensagens /////
61
+ message TextMessage {
62
+ string type = 1;
63
+ string url = 2;
64
+ string filename = 3;
65
+ string title = 4;
66
+ string detail = 5;
67
+ string caption = 6;
68
+ }
69
+
70
+ message Button{
71
+ string type = 1;
72
+ string title = 2;
73
+ string detail = 3;
74
+ }
75
+
76
+ message Message {
77
+ ChatID chat_id = 1;
78
+ TextMessage message = 2;
79
+ repeated Button buttons = 3;
80
+ Button display_button = 4;
81
+ }
82
+
83
+ ///// Mensagens para Serviços de Transfer /////
84
+ message TransferToHumanRequest{
85
+ ChatID chat_id = 1;
86
+ string campaign_id = 2;
87
+ }
88
+
89
+ message TransferToMenuRequest{
90
+ ChatID chat_id = 1;
91
+ string menu = 2;
92
+ string user_message = 3;
93
+ }
94
+
95
+ message TabulationName{
96
+ string name = 1;
97
+ }
98
+
99
+ message TabulationDetails{
100
+ string id = 1;
101
+ string name = 2;
102
+ string last_update = 3;
103
+ }
104
+
105
+ message TabulationsList{
106
+ repeated TabulationDetails tabulations = 1;
107
+ }
108
+
109
+ ///// Serviços de EndChat /////
110
+ message EndChatRequest {
111
+ ChatID chat_id = 1;
112
+ string tabulation_id = 2;
113
+ }
114
+
115
+ message CampaignName {
116
+ string name = 1;
117
+ }
118
+
119
+ message CampaignDetails {
120
+ string id = 1;
121
+ string name = 2;
122
+ string last_update = 3;
123
+ }
124
+
125
+ message CampaignsList {
126
+ repeated CampaignDetails campaigns = 1;
127
+ }
@@ -0,0 +1,77 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: router.proto
5
+ # Protobuf Python Version: 5.27.2
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 5,
15
+ 27,
16
+ 2,
17
+ '',
18
+ 'router.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+
26
+
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0crouter.proto\x12\x07\x63hatbot\"\x06\n\x04Void\"0\n\rRequestStatus\x12\x0e\n\x06status\x18\x01 \x01(\x08\x12\x0f\n\x07message\x18\x02 \x01(\t\"-\n\x06\x43hatID\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x12\n\ncompany_id\x18\x02 \x01(\t\"q\n\tUserState\x12 \n\x07\x63hat_id\x18\x01 \x01(\x0b\x32\x0f.chatbot.ChatID\x12\x0c\n\x04menu\x18\x02 \x01(\t\x12\r\n\x05route\x18\x03 \x01(\t\x12\x10\n\x08protocol\x18\x04 \x01(\t\x12\x13\n\x0bobservation\x18\x05 \x01(\t\"8\n\rUserStateList\x12\'\n\x0buser_states\x18\x01 \x03(\x0b\x32\x12.chatbot.UserState\"j\n\x0bTextMessage\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\x10\n\x08\x66ilename\x18\x03 \x01(\t\x12\r\n\x05title\x18\x04 \x01(\t\x12\x0e\n\x06\x64\x65tail\x18\x05 \x01(\t\x12\x0f\n\x07\x63\x61ption\x18\x06 \x01(\t\"5\n\x06\x42utton\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12\x0e\n\x06\x64\x65tail\x18\x03 \x01(\t\"\x9d\x01\n\x07Message\x12 \n\x07\x63hat_id\x18\x01 \x01(\x0b\x32\x0f.chatbot.ChatID\x12%\n\x07message\x18\x02 \x01(\x0b\x32\x14.chatbot.TextMessage\x12 \n\x07\x62uttons\x18\x03 \x03(\x0b\x32\x0f.chatbot.Button\x12\'\n\x0e\x64isplay_button\x18\x04 \x01(\x0b\x32\x0f.chatbot.Button\"O\n\x16TransferToHumanRequest\x12 \n\x07\x63hat_id\x18\x01 \x01(\x0b\x32\x0f.chatbot.ChatID\x12\x13\n\x0b\x63\x61mpaign_id\x18\x02 \x01(\t\"]\n\x15TransferToMenuRequest\x12 \n\x07\x63hat_id\x18\x01 \x01(\x0b\x32\x0f.chatbot.ChatID\x12\x0c\n\x04menu\x18\x02 \x01(\t\x12\x14\n\x0cuser_message\x18\x03 \x01(\t\"\x1e\n\x0eTabulationName\x12\x0c\n\x04name\x18\x01 \x01(\t\"B\n\x11TabulationDetails\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0blast_update\x18\x03 \x01(\t\"B\n\x0fTabulationsList\x12/\n\x0btabulations\x18\x01 \x03(\x0b\x32\x1a.chatbot.TabulationDetails\"I\n\x0e\x45ndChatRequest\x12 \n\x07\x63hat_id\x18\x01 \x01(\x0b\x32\x0f.chatbot.ChatID\x12\x15\n\rtabulation_id\x18\x02 \x01(\t\"\x1c\n\x0c\x43\x61mpaignName\x12\x0c\n\x04name\x18\x01 \x01(\t\"@\n\x0f\x43\x61mpaignDetails\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0blast_update\x18\x03 \x01(\t\"<\n\rCampaignsList\x12+\n\tcampaigns\x18\x01 \x03(\x0b\x32\x18.chatbot.CampaignDetails2\x83\x02\n\x10UserStateService\x12\x43\n\x15InsertUpdateUserState\x12\x12.chatbot.UserState\x1a\x16.chatbot.RequestStatus\x12:\n\x0f\x44\x65leteUserState\x12\x0f.chatbot.ChatID\x1a\x16.chatbot.RequestStatus\x12\x33\n\x0cGetUserState\x12\x0f.chatbot.ChatID\x1a\x12.chatbot.UserState\x12\x39\n\x10GetAllUserStates\x12\r.chatbot.Void\x1a\x16.chatbot.UserStateList2F\n\x0bSendMessage\x12\x37\n\x0bSendMessage\x12\x10.chatbot.Message\x1a\x16.chatbot.RequestStatus2\x9c\x02\n\x08Transfer\x12\x38\n\x0fGetAllCampaigns\x12\r.chatbot.Void\x1a\x16.chatbot.CampaignsList\x12@\n\rGetCampaignID\x12\x15.chatbot.CampaignName\x1a\x18.chatbot.CampaignDetails\x12J\n\x0fTransferToHuman\x12\x1f.chatbot.TransferToHumanRequest\x1a\x16.chatbot.RequestStatus\x12H\n\x0eTransferToMenu\x12\x1e.chatbot.TransferToMenuRequest\x1a\x16.chatbot.RequestStatus2\xcb\x01\n\x07\x45ndChat\x12<\n\x11GetAllTabulations\x12\r.chatbot.Void\x1a\x18.chatbot.TabulationsList\x12\x46\n\x0fGetTabulationID\x12\x17.chatbot.TabulationName\x1a\x1a.chatbot.TabulationDetails\x12:\n\x07\x45ndChat\x12\x17.chatbot.EndChatRequest\x1a\x16.chatbot.RequestStatusB\x0bZ\t./chatbotb\x06proto3')
28
+
29
+ _globals = globals()
30
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
31
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'router_pb2', _globals)
32
+ if not _descriptor._USE_C_DESCRIPTORS:
33
+ _globals['DESCRIPTOR']._loaded_options = None
34
+ _globals['DESCRIPTOR']._serialized_options = b'Z\t./chatbot'
35
+ _globals['_VOID']._serialized_start=25
36
+ _globals['_VOID']._serialized_end=31
37
+ _globals['_REQUESTSTATUS']._serialized_start=33
38
+ _globals['_REQUESTSTATUS']._serialized_end=81
39
+ _globals['_CHATID']._serialized_start=83
40
+ _globals['_CHATID']._serialized_end=128
41
+ _globals['_USERSTATE']._serialized_start=130
42
+ _globals['_USERSTATE']._serialized_end=243
43
+ _globals['_USERSTATELIST']._serialized_start=245
44
+ _globals['_USERSTATELIST']._serialized_end=301
45
+ _globals['_TEXTMESSAGE']._serialized_start=303
46
+ _globals['_TEXTMESSAGE']._serialized_end=409
47
+ _globals['_BUTTON']._serialized_start=411
48
+ _globals['_BUTTON']._serialized_end=464
49
+ _globals['_MESSAGE']._serialized_start=467
50
+ _globals['_MESSAGE']._serialized_end=624
51
+ _globals['_TRANSFERTOHUMANREQUEST']._serialized_start=626
52
+ _globals['_TRANSFERTOHUMANREQUEST']._serialized_end=705
53
+ _globals['_TRANSFERTOMENUREQUEST']._serialized_start=707
54
+ _globals['_TRANSFERTOMENUREQUEST']._serialized_end=800
55
+ _globals['_TABULATIONNAME']._serialized_start=802
56
+ _globals['_TABULATIONNAME']._serialized_end=832
57
+ _globals['_TABULATIONDETAILS']._serialized_start=834
58
+ _globals['_TABULATIONDETAILS']._serialized_end=900
59
+ _globals['_TABULATIONSLIST']._serialized_start=902
60
+ _globals['_TABULATIONSLIST']._serialized_end=968
61
+ _globals['_ENDCHATREQUEST']._serialized_start=970
62
+ _globals['_ENDCHATREQUEST']._serialized_end=1043
63
+ _globals['_CAMPAIGNNAME']._serialized_start=1045
64
+ _globals['_CAMPAIGNNAME']._serialized_end=1073
65
+ _globals['_CAMPAIGNDETAILS']._serialized_start=1075
66
+ _globals['_CAMPAIGNDETAILS']._serialized_end=1139
67
+ _globals['_CAMPAIGNSLIST']._serialized_start=1141
68
+ _globals['_CAMPAIGNSLIST']._serialized_end=1201
69
+ _globals['_USERSTATESERVICE']._serialized_start=1204
70
+ _globals['_USERSTATESERVICE']._serialized_end=1463
71
+ _globals['_SENDMESSAGE']._serialized_start=1465
72
+ _globals['_SENDMESSAGE']._serialized_end=1535
73
+ _globals['_TRANSFER']._serialized_start=1538
74
+ _globals['_TRANSFER']._serialized_end=1822
75
+ _globals['_ENDCHAT']._serialized_start=1825
76
+ _globals['_ENDCHAT']._serialized_end=2028
77
+ # @@protoc_insertion_point(module_scope)