sentdm 0.33.0 → 0.35.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +11 -9
- data/lib/sentdm/client.rb +25 -0
- data/lib/sentdm/internal/calls_page.rb +115 -0
- data/lib/sentdm/models/api_response_of_call.rb +43 -0
- data/lib/sentdm/models/api_response_of_call_recordings.rb +43 -0
- data/lib/sentdm/models/api_response_of_calls_list.rb +42 -0
- data/lib/sentdm/models/call.rb +133 -0
- data/lib/sentdm/models/call_event.rb +72 -0
- data/lib/sentdm/models/call_event_payload.rb +102 -0
- data/lib/sentdm/models/call_hangup_params.rb +32 -0
- data/lib/sentdm/models/call_list_params.rb +83 -0
- data/lib/sentdm/models/call_list_recordings_params.rb +26 -0
- data/lib/sentdm/models/call_party.rb +31 -0
- data/lib/sentdm/models/call_record_params.rb +55 -0
- data/lib/sentdm/models/call_recording.rb +38 -0
- data/lib/sentdm/models/call_recordings.rb +24 -0
- data/lib/sentdm/models/call_retrieve_params.rb +26 -0
- data/lib/sentdm/models/call_timeline_entry.rb +26 -0
- data/lib/sentdm/models/calls/api_response_of_list_of_call_participant.rb +45 -0
- data/lib/sentdm/models/calls/call_participant.rb +60 -0
- data/lib/sentdm/models/calls/call_participant_target.rb +30 -0
- data/lib/sentdm/models/calls/participant_add_params.rb +66 -0
- data/lib/sentdm/models/calls/participant_list_params.rb +28 -0
- data/lib/sentdm/models/calls/participant_remove_all_params.rb +28 -0
- data/lib/sentdm/models/calls/participant_remove_params.rb +34 -0
- data/lib/sentdm/models/calls/participant_update_params.rb +64 -0
- data/lib/sentdm/models/calls_list.rb +26 -0
- data/lib/sentdm/models/channel_event_payload.rb +16 -6
- data/lib/sentdm/models/channels/api_response_of_list_of_voice_number.rb +45 -0
- data/lib/sentdm/models/channels/api_response_of_voice_callback_test.rb +45 -0
- data/lib/sentdm/models/channels/api_response_of_voice_number.rb +45 -0
- data/lib/sentdm/models/channels/api_response_of_voice_number_created.rb +45 -0
- data/lib/sentdm/models/channels/api_response_of_voice_secret.rb +45 -0
- data/lib/sentdm/models/channels/api_response_of_voice_token.rb +45 -0
- data/lib/sentdm/models/channels/voice_callback_test.rb +65 -0
- data/lib/sentdm/models/channels/voice_callback_test_error_info.rb +41 -0
- data/lib/sentdm/models/channels/voice_callback_test_request_info.rb +40 -0
- data/lib/sentdm/models/channels/voice_callback_test_response_info.rb +28 -0
- data/lib/sentdm/models/channels/voice_create_params.rb +86 -0
- data/lib/sentdm/models/channels/voice_create_token_params.rb +69 -0
- data/lib/sentdm/models/channels/voice_list_params.rb +22 -0
- data/lib/sentdm/models/channels/voice_number.rb +68 -0
- data/lib/sentdm/models/channels/voice_number_created.rb +26 -0
- data/lib/sentdm/models/channels/voice_retrieve_params.rb +28 -0
- data/lib/sentdm/models/channels/voice_rotate_secret_params.rb +34 -0
- data/lib/sentdm/models/channels/voice_secret.rb +25 -0
- data/lib/sentdm/models/channels/voice_test_params.rb +34 -0
- data/lib/sentdm/models/channels/voice_token.rb +44 -0
- data/lib/sentdm/models/channels/voice_update_params.rb +95 -0
- data/lib/sentdm/models/conversation_messages_list.rb +100 -13
- data/lib/sentdm/models/inbound_message_event_payload.rb +70 -3
- data/lib/sentdm/models/me_retrieve_response.rb +21 -1
- data/lib/sentdm/models/message_event_payload.rb +23 -1
- data/lib/sentdm/models/message_retrieve_activities_response.rb +23 -1
- data/lib/sentdm/models/message_retrieve_status_response.rb +100 -13
- data/lib/sentdm/models/template_create_params.rb +11 -1
- data/lib/sentdm/models/webhook_create_params.rb +31 -1
- data/lib/sentdm/models/webhook_list_events_response.rb +7 -3
- data/lib/sentdm/models/webhook_update_params.rb +31 -1
- data/lib/sentdm/models.rb +36 -0
- data/lib/sentdm/resources/calls/participants.rb +231 -0
- data/lib/sentdm/resources/calls.rb +235 -0
- data/lib/sentdm/resources/channels/voice.rb +381 -0
- data/lib/sentdm/resources/channels.rb +45 -0
- data/lib/sentdm/resources/me.rb +5 -0
- data/lib/sentdm/resources/templates.rb +3 -1
- data/lib/sentdm/resources/webhooks.rb +9 -3
- data/lib/sentdm/version.rb +1 -1
- data/lib/sentdm.rb +50 -0
- data/rbi/sentdm/client.rbi +23 -0
- data/rbi/sentdm/internal/calls_page.rbi +71 -0
- data/rbi/sentdm/models/api_response_of_call.rbi +74 -0
- data/rbi/sentdm/models/api_response_of_call_recordings.rbi +74 -0
- data/rbi/sentdm/models/api_response_of_calls_list.rbi +74 -0
- data/rbi/sentdm/models/call.rbi +177 -0
- data/rbi/sentdm/models/call_event.rbi +114 -0
- data/rbi/sentdm/models/call_event_payload.rbi +135 -0
- data/rbi/sentdm/models/call_hangup_params.rbi +59 -0
- data/rbi/sentdm/models/call_list_params.rbi +112 -0
- data/rbi/sentdm/models/call_list_recordings_params.rbi +46 -0
- data/rbi/sentdm/models/call_party.rbi +41 -0
- data/rbi/sentdm/models/call_record_params.rbi +83 -0
- data/rbi/sentdm/models/call_recording.rbi +59 -0
- data/rbi/sentdm/models/call_recordings.rbi +39 -0
- data/rbi/sentdm/models/call_retrieve_params.rbi +46 -0
- data/rbi/sentdm/models/call_timeline_entry.rbi +40 -0
- data/rbi/sentdm/models/calls/api_response_of_list_of_call_participant.rbi +76 -0
- data/rbi/sentdm/models/calls/call_participant.rbi +92 -0
- data/rbi/sentdm/models/calls/call_participant_target.rbi +47 -0
- data/rbi/sentdm/models/calls/participant_add_params.rbi +98 -0
- data/rbi/sentdm/models/calls/participant_list_params.rbi +51 -0
- data/rbi/sentdm/models/calls/participant_remove_all_params.rbi +51 -0
- data/rbi/sentdm/models/calls/participant_remove_params.rbi +61 -0
- data/rbi/sentdm/models/calls/participant_update_params.rbi +94 -0
- data/rbi/sentdm/models/calls_list.rbi +47 -0
- data/rbi/sentdm/models/channel_event_payload.rbi +20 -8
- data/rbi/sentdm/models/channels/api_response_of_list_of_voice_number.rbi +76 -0
- data/rbi/sentdm/models/channels/api_response_of_voice_callback_test.rbi +83 -0
- data/rbi/sentdm/models/channels/api_response_of_voice_number.rbi +81 -0
- data/rbi/sentdm/models/channels/api_response_of_voice_number_created.rbi +83 -0
- data/rbi/sentdm/models/channels/api_response_of_voice_secret.rbi +81 -0
- data/rbi/sentdm/models/channels/api_response_of_voice_token.rbi +81 -0
- data/rbi/sentdm/models/channels/voice_callback_test.rbi +126 -0
- data/rbi/sentdm/models/channels/voice_callback_test_error_info.rbi +65 -0
- data/rbi/sentdm/models/channels/voice_callback_test_request_info.rbi +66 -0
- data/rbi/sentdm/models/channels/voice_callback_test_response_info.rbi +48 -0
- data/rbi/sentdm/models/channels/voice_create_params.rbi +127 -0
- data/rbi/sentdm/models/channels/voice_create_token_params.rbi +104 -0
- data/rbi/sentdm/models/channels/voice_list_params.rbi +40 -0
- data/rbi/sentdm/models/channels/voice_number.rbi +105 -0
- data/rbi/sentdm/models/channels/voice_number_created.rbi +42 -0
- data/rbi/sentdm/models/channels/voice_retrieve_params.rbi +51 -0
- data/rbi/sentdm/models/channels/voice_rotate_secret_params.rbi +64 -0
- data/rbi/sentdm/models/channels/voice_secret.rbi +35 -0
- data/rbi/sentdm/models/channels/voice_test_params.rbi +61 -0
- data/rbi/sentdm/models/channels/voice_token.rbi +76 -0
- data/rbi/sentdm/models/channels/voice_update_params.rbi +158 -0
- data/rbi/sentdm/models/conversation_messages_list.rbi +122 -19
- data/rbi/sentdm/models/inbound_message_event_payload.rbi +110 -2
- data/rbi/sentdm/models/me_retrieve_response.rbi +35 -0
- data/rbi/sentdm/models/message_event_payload.rbi +28 -0
- data/rbi/sentdm/models/message_retrieve_activities_response.rbi +26 -0
- data/rbi/sentdm/models/message_retrieve_status_response.rbi +122 -19
- data/rbi/sentdm/models/template_create_params.rbi +15 -0
- data/rbi/sentdm/models/webhook_create_params.rbi +61 -0
- data/rbi/sentdm/models/webhook_list_events_response.rbi +6 -3
- data/rbi/sentdm/models/webhook_update_params.rbi +61 -0
- data/rbi/sentdm/models.rbi +36 -0
- data/rbi/sentdm/resources/calls/participants.rbi +199 -0
- data/rbi/sentdm/resources/calls.rbi +206 -0
- data/rbi/sentdm/resources/channels/voice.rbi +371 -0
- data/rbi/sentdm/resources/channels.rbi +42 -0
- data/rbi/sentdm/resources/me.rbi +5 -0
- data/rbi/sentdm/resources/templates.rbi +6 -0
- data/rbi/sentdm/resources/webhooks.rbi +15 -1
- data/sig/sentdm/client.rbs +4 -0
- data/sig/sentdm/internal/calls_page.rbs +41 -0
- data/sig/sentdm/models/api_response_of_call.rbs +39 -0
- data/sig/sentdm/models/api_response_of_call_recordings.rbs +39 -0
- data/sig/sentdm/models/api_response_of_calls_list.rbs +39 -0
- data/sig/sentdm/models/call.rbs +101 -0
- data/sig/sentdm/models/call_event.rbs +44 -0
- data/sig/sentdm/models/call_event_payload.rbs +68 -0
- data/sig/sentdm/models/call_hangup_params.rbs +38 -0
- data/sig/sentdm/models/call_list_params.rbs +67 -0
- data/sig/sentdm/models/call_list_recordings_params.rbs +30 -0
- data/sig/sentdm/models/call_party.rbs +17 -0
- data/sig/sentdm/models/call_record_params.rbs +54 -0
- data/sig/sentdm/models/call_recording.rbs +32 -0
- data/sig/sentdm/models/call_recordings.rbs +17 -0
- data/sig/sentdm/models/call_retrieve_params.rbs +30 -0
- data/sig/sentdm/models/call_timeline_entry.rbs +19 -0
- data/sig/sentdm/models/calls/api_response_of_list_of_call_participant.rbs +41 -0
- data/sig/sentdm/models/calls/call_participant.rbs +52 -0
- data/sig/sentdm/models/calls/call_participant_target.rbs +23 -0
- data/sig/sentdm/models/calls/participant_add_params.rbs +63 -0
- data/sig/sentdm/models/calls/participant_list_params.rbs +32 -0
- data/sig/sentdm/models/calls/participant_remove_all_params.rbs +34 -0
- data/sig/sentdm/models/calls/participant_remove_params.rbs +40 -0
- data/sig/sentdm/models/calls/participant_update_params.rbs +61 -0
- data/sig/sentdm/models/calls_list.rbs +26 -0
- data/sig/sentdm/models/channel_event_payload.rbs +5 -0
- data/sig/sentdm/models/channels/api_response_of_list_of_voice_number.rbs +41 -0
- data/sig/sentdm/models/channels/api_response_of_voice_callback_test.rbs +41 -0
- data/sig/sentdm/models/channels/api_response_of_voice_number.rbs +41 -0
- data/sig/sentdm/models/channels/api_response_of_voice_number_created.rbs +41 -0
- data/sig/sentdm/models/channels/api_response_of_voice_secret.rbs +41 -0
- data/sig/sentdm/models/channels/api_response_of_voice_token.rbs +41 -0
- data/sig/sentdm/models/channels/voice_callback_test.rbs +51 -0
- data/sig/sentdm/models/channels/voice_callback_test_error_info.rbs +28 -0
- data/sig/sentdm/models/channels/voice_callback_test_request_info.rbs +34 -0
- data/sig/sentdm/models/channels/voice_callback_test_response_info.rbs +20 -0
- data/sig/sentdm/models/channels/voice_create_params.rbs +64 -0
- data/sig/sentdm/models/channels/voice_create_token_params.rbs +61 -0
- data/sig/sentdm/models/channels/voice_list_params.rbs +27 -0
- data/sig/sentdm/models/channels/voice_number.rbs +57 -0
- data/sig/sentdm/models/channels/voice_number_created.rbs +17 -0
- data/sig/sentdm/models/channels/voice_retrieve_params.rbs +32 -0
- data/sig/sentdm/models/channels/voice_rotate_secret_params.rbs +40 -0
- data/sig/sentdm/models/channels/voice_secret.rbs +17 -0
- data/sig/sentdm/models/channels/voice_test_params.rbs +40 -0
- data/sig/sentdm/models/channels/voice_token.rbs +40 -0
- data/sig/sentdm/models/channels/voice_update_params.rbs +78 -0
- data/sig/sentdm/models/conversation_messages_list.rbs +56 -8
- data/sig/sentdm/models/inbound_message_event_payload.rbs +37 -0
- data/sig/sentdm/models/me_retrieve_response.rbs +7 -0
- data/sig/sentdm/models/message_event_payload.rbs +10 -0
- data/sig/sentdm/models/message_retrieve_activities_response.rbs +10 -0
- data/sig/sentdm/models/message_retrieve_status_response.rbs +56 -8
- data/sig/sentdm/models/template_create_params.rbs +7 -0
- data/sig/sentdm/models/webhook_create_params.rbs +29 -0
- data/sig/sentdm/models/webhook_list_events_response.rbs +1 -0
- data/sig/sentdm/models/webhook_update_params.rbs +29 -0
- data/sig/sentdm/models.rbs +36 -0
- data/sig/sentdm/resources/calls/participants.rbs +50 -0
- data/sig/sentdm/resources/calls.rbs +50 -0
- data/sig/sentdm/resources/channels/voice.rbs +68 -0
- data/sig/sentdm/resources/channels.rbs +9 -0
- data/sig/sentdm/resources/templates.rbs +1 -0
- data/sig/sentdm/resources/webhooks.rbs +2 -0
- metadata +152 -2
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Sentdm
|
|
4
|
+
module Models
|
|
5
|
+
module Channels
|
|
6
|
+
class VoiceTestParams < Sentdm::Models::MutationRequest
|
|
7
|
+
extend Sentdm::Internal::Type::RequestParameters::Converter
|
|
8
|
+
include Sentdm::Internal::Type::RequestParameters
|
|
9
|
+
|
|
10
|
+
OrHash =
|
|
11
|
+
T.type_alias do
|
|
12
|
+
T.any(Sentdm::Channels::VoiceTestParams, Sentdm::Internal::AnyHash)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
sig { returns(String) }
|
|
16
|
+
attr_accessor :number
|
|
17
|
+
|
|
18
|
+
sig { returns(T.nilable(String)) }
|
|
19
|
+
attr_reader :idempotency_key
|
|
20
|
+
|
|
21
|
+
sig { params(idempotency_key: String).void }
|
|
22
|
+
attr_writer :idempotency_key
|
|
23
|
+
|
|
24
|
+
sig { returns(T.nilable(String)) }
|
|
25
|
+
attr_reader :x_profile_id
|
|
26
|
+
|
|
27
|
+
sig { params(x_profile_id: String).void }
|
|
28
|
+
attr_writer :x_profile_id
|
|
29
|
+
|
|
30
|
+
sig do
|
|
31
|
+
params(
|
|
32
|
+
number: String,
|
|
33
|
+
idempotency_key: String,
|
|
34
|
+
x_profile_id: String,
|
|
35
|
+
request_options: Sentdm::RequestOptions::OrHash
|
|
36
|
+
).returns(T.attached_class)
|
|
37
|
+
end
|
|
38
|
+
def self.new(
|
|
39
|
+
number:,
|
|
40
|
+
idempotency_key: nil,
|
|
41
|
+
x_profile_id: nil,
|
|
42
|
+
request_options: {}
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
sig do
|
|
47
|
+
override.returns(
|
|
48
|
+
{
|
|
49
|
+
number: String,
|
|
50
|
+
idempotency_key: String,
|
|
51
|
+
x_profile_id: String,
|
|
52
|
+
request_options: Sentdm::RequestOptions
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
end
|
|
56
|
+
def to_hash
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Sentdm
|
|
4
|
+
module Models
|
|
5
|
+
module Channels
|
|
6
|
+
class VoiceToken < Sentdm::Internal::Type::BaseModel
|
|
7
|
+
OrHash =
|
|
8
|
+
T.type_alias do
|
|
9
|
+
T.any(Sentdm::Channels::VoiceToken, Sentdm::Internal::AnyHash)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# The signed token. Hand it to the client SDK unchanged.
|
|
13
|
+
sig { returns(T.nilable(String)) }
|
|
14
|
+
attr_reader :token
|
|
15
|
+
|
|
16
|
+
sig { params(token: String).void }
|
|
17
|
+
attr_writer :token
|
|
18
|
+
|
|
19
|
+
# When the token expires (UTC)
|
|
20
|
+
sig { returns(T.nilable(Time)) }
|
|
21
|
+
attr_reader :expires_at
|
|
22
|
+
|
|
23
|
+
sig { params(expires_at: Time).void }
|
|
24
|
+
attr_writer :expires_at
|
|
25
|
+
|
|
26
|
+
# The identity the token was minted for
|
|
27
|
+
sig { returns(T.nilable(String)) }
|
|
28
|
+
attr_reader :identity
|
|
29
|
+
|
|
30
|
+
sig { params(identity: String).void }
|
|
31
|
+
attr_writer :identity
|
|
32
|
+
|
|
33
|
+
# The phone number this identity is now bound to, in E.164 format
|
|
34
|
+
sig { returns(T.nilable(String)) }
|
|
35
|
+
attr_reader :number
|
|
36
|
+
|
|
37
|
+
sig { params(number: String).void }
|
|
38
|
+
attr_writer :number
|
|
39
|
+
|
|
40
|
+
# A short-lived token your app passes to the voice client SDK to register
|
|
41
|
+
sig do
|
|
42
|
+
params(
|
|
43
|
+
token: String,
|
|
44
|
+
expires_at: Time,
|
|
45
|
+
identity: String,
|
|
46
|
+
number: String
|
|
47
|
+
).returns(T.attached_class)
|
|
48
|
+
end
|
|
49
|
+
def self.new(
|
|
50
|
+
# The signed token. Hand it to the client SDK unchanged.
|
|
51
|
+
token: nil,
|
|
52
|
+
# When the token expires (UTC)
|
|
53
|
+
expires_at: nil,
|
|
54
|
+
# The identity the token was minted for
|
|
55
|
+
identity: nil,
|
|
56
|
+
# The phone number this identity is now bound to, in E.164 format
|
|
57
|
+
number: nil
|
|
58
|
+
)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
sig do
|
|
62
|
+
override.returns(
|
|
63
|
+
{
|
|
64
|
+
token: String,
|
|
65
|
+
expires_at: Time,
|
|
66
|
+
identity: String,
|
|
67
|
+
number: String
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
end
|
|
71
|
+
def to_hash
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Sentdm
|
|
4
|
+
module Models
|
|
5
|
+
module Channels
|
|
6
|
+
class VoiceUpdateParams < Sentdm::Internal::Type::BaseModel
|
|
7
|
+
extend Sentdm::Internal::Type::RequestParameters::Converter
|
|
8
|
+
include Sentdm::Internal::Type::RequestParameters
|
|
9
|
+
|
|
10
|
+
OrHash =
|
|
11
|
+
T.type_alias do
|
|
12
|
+
T.any(
|
|
13
|
+
Sentdm::Channels::VoiceUpdateParams,
|
|
14
|
+
Sentdm::Internal::AnyHash
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
sig { returns(String) }
|
|
19
|
+
attr_accessor :number
|
|
20
|
+
|
|
21
|
+
# A new callback URL for the number, active or not: an absolute HTTP or HTTPS URL
|
|
22
|
+
# on a public host, where Sent asks what to do with each call. The signing secret
|
|
23
|
+
# is kept.
|
|
24
|
+
sig { returns(T.nilable(String)) }
|
|
25
|
+
attr_accessor :callback_url
|
|
26
|
+
|
|
27
|
+
# true makes this the line app-originated calls are placed from when a voice token
|
|
28
|
+
# names no number. false is refused: an account with active voice numbers always
|
|
29
|
+
# has exactly one default, so the default moves by giving it to another number.
|
|
30
|
+
sig { returns(T.nilable(T::Boolean)) }
|
|
31
|
+
attr_accessor :default_for_app_calls
|
|
32
|
+
|
|
33
|
+
# Sandbox flag - when true, the operation is simulated without side effects Useful
|
|
34
|
+
# for testing integrations without actual execution
|
|
35
|
+
sig { returns(T.nilable(T::Boolean)) }
|
|
36
|
+
attr_reader :sandbox
|
|
37
|
+
|
|
38
|
+
sig { params(sandbox: T::Boolean).void }
|
|
39
|
+
attr_writer :sandbox
|
|
40
|
+
|
|
41
|
+
# ACTIVE turns calls on for the number again, INACTIVE turns them off. Matched
|
|
42
|
+
# ignoring case. Turning the default line off is refused while other active voice
|
|
43
|
+
# numbers remain.
|
|
44
|
+
sig do
|
|
45
|
+
returns(
|
|
46
|
+
T.nilable(Sentdm::Channels::VoiceUpdateParams::Status::OrSymbol)
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
attr_accessor :status
|
|
50
|
+
|
|
51
|
+
sig { returns(T.nilable(String)) }
|
|
52
|
+
attr_reader :idempotency_key
|
|
53
|
+
|
|
54
|
+
sig { params(idempotency_key: String).void }
|
|
55
|
+
attr_writer :idempotency_key
|
|
56
|
+
|
|
57
|
+
sig { returns(T.nilable(String)) }
|
|
58
|
+
attr_reader :x_profile_id
|
|
59
|
+
|
|
60
|
+
sig { params(x_profile_id: String).void }
|
|
61
|
+
attr_writer :x_profile_id
|
|
62
|
+
|
|
63
|
+
sig do
|
|
64
|
+
params(
|
|
65
|
+
number: String,
|
|
66
|
+
callback_url: T.nilable(String),
|
|
67
|
+
default_for_app_calls: T.nilable(T::Boolean),
|
|
68
|
+
sandbox: T::Boolean,
|
|
69
|
+
status:
|
|
70
|
+
T.nilable(Sentdm::Channels::VoiceUpdateParams::Status::OrSymbol),
|
|
71
|
+
idempotency_key: String,
|
|
72
|
+
x_profile_id: String,
|
|
73
|
+
request_options: Sentdm::RequestOptions::OrHash
|
|
74
|
+
).returns(T.attached_class)
|
|
75
|
+
end
|
|
76
|
+
def self.new(
|
|
77
|
+
number:,
|
|
78
|
+
# A new callback URL for the number, active or not: an absolute HTTP or HTTPS URL
|
|
79
|
+
# on a public host, where Sent asks what to do with each call. The signing secret
|
|
80
|
+
# is kept.
|
|
81
|
+
callback_url: nil,
|
|
82
|
+
# true makes this the line app-originated calls are placed from when a voice token
|
|
83
|
+
# names no number. false is refused: an account with active voice numbers always
|
|
84
|
+
# has exactly one default, so the default moves by giving it to another number.
|
|
85
|
+
default_for_app_calls: nil,
|
|
86
|
+
# Sandbox flag - when true, the operation is simulated without side effects Useful
|
|
87
|
+
# for testing integrations without actual execution
|
|
88
|
+
sandbox: nil,
|
|
89
|
+
# ACTIVE turns calls on for the number again, INACTIVE turns them off. Matched
|
|
90
|
+
# ignoring case. Turning the default line off is refused while other active voice
|
|
91
|
+
# numbers remain.
|
|
92
|
+
status: nil,
|
|
93
|
+
idempotency_key: nil,
|
|
94
|
+
x_profile_id: nil,
|
|
95
|
+
request_options: {}
|
|
96
|
+
)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
sig do
|
|
100
|
+
override.returns(
|
|
101
|
+
{
|
|
102
|
+
number: String,
|
|
103
|
+
callback_url: T.nilable(String),
|
|
104
|
+
default_for_app_calls: T.nilable(T::Boolean),
|
|
105
|
+
sandbox: T::Boolean,
|
|
106
|
+
status:
|
|
107
|
+
T.nilable(
|
|
108
|
+
Sentdm::Channels::VoiceUpdateParams::Status::OrSymbol
|
|
109
|
+
),
|
|
110
|
+
idempotency_key: String,
|
|
111
|
+
x_profile_id: String,
|
|
112
|
+
request_options: Sentdm::RequestOptions
|
|
113
|
+
}
|
|
114
|
+
)
|
|
115
|
+
end
|
|
116
|
+
def to_hash
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# ACTIVE turns calls on for the number again, INACTIVE turns them off. Matched
|
|
120
|
+
# ignoring case. Turning the default line off is refused while other active voice
|
|
121
|
+
# numbers remain.
|
|
122
|
+
module Status
|
|
123
|
+
extend Sentdm::Internal::Type::Enum
|
|
124
|
+
|
|
125
|
+
TaggedSymbol =
|
|
126
|
+
T.type_alias do
|
|
127
|
+
T.all(Symbol, Sentdm::Channels::VoiceUpdateParams::Status)
|
|
128
|
+
end
|
|
129
|
+
OrSymbol = T.type_alias { T.any(Symbol, String) }
|
|
130
|
+
|
|
131
|
+
# Turns calls on for the number again. The callback URL and the signing secret it had are kept; send `callback_url` in the same call to replace the URL.
|
|
132
|
+
ACTIVE =
|
|
133
|
+
T.let(
|
|
134
|
+
:ACTIVE,
|
|
135
|
+
Sentdm::Channels::VoiceUpdateParams::Status::TaggedSymbol
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# Turns calls off for the number. Refused while the number is the default line for app calls and other active voice numbers remain; move the default first. The callback URL and the secret stay on the number.
|
|
139
|
+
INACTIVE =
|
|
140
|
+
T.let(
|
|
141
|
+
:INACTIVE,
|
|
142
|
+
Sentdm::Channels::VoiceUpdateParams::Status::TaggedSymbol
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
sig do
|
|
146
|
+
override.returns(
|
|
147
|
+
T::Array[
|
|
148
|
+
Sentdm::Channels::VoiceUpdateParams::Status::TaggedSymbol
|
|
149
|
+
]
|
|
150
|
+
)
|
|
151
|
+
end
|
|
152
|
+
def self.values
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
@@ -152,6 +152,20 @@ module Sentdm
|
|
|
152
152
|
sig { returns(T.nilable(Float)) }
|
|
153
153
|
attr_accessor :price
|
|
154
154
|
|
|
155
|
+
# A human-readable sentence for reason_code, for example "Insufficient balance".
|
|
156
|
+
# Omitted whenever reason_code is.
|
|
157
|
+
sig { returns(T.nilable(String)) }
|
|
158
|
+
attr_accessor :reason
|
|
159
|
+
|
|
160
|
+
# Why the message is at its current status, as a stable platform code such as
|
|
161
|
+
# DELIVERY_007, BUSINESS_003 or DELIVERY_003. Present when the current status is
|
|
162
|
+
# FAILED, FILTERED or BLOCKED and the lifecycle was loaded; omitted otherwise.
|
|
163
|
+
# Switch on this rather than on reason: the code is stable, the wording may be
|
|
164
|
+
# improved. It is the platform's classification of the outcome, never a carrier or
|
|
165
|
+
# vendor code.
|
|
166
|
+
sig { returns(T.nilable(String)) }
|
|
167
|
+
attr_accessor :reason_code
|
|
168
|
+
|
|
155
169
|
sig { returns(T.nilable(String)) }
|
|
156
170
|
attr_reader :region_code
|
|
157
171
|
|
|
@@ -201,6 +215,8 @@ module Sentdm
|
|
|
201
215
|
phone: String,
|
|
202
216
|
phone_international: String,
|
|
203
217
|
price: T.nilable(Float),
|
|
218
|
+
reason: T.nilable(String),
|
|
219
|
+
reason_code: T.nilable(String),
|
|
204
220
|
region_code: String,
|
|
205
221
|
status: String,
|
|
206
222
|
template_category: T.nilable(String),
|
|
@@ -230,6 +246,16 @@ module Sentdm
|
|
|
230
246
|
phone: nil,
|
|
231
247
|
phone_international: nil,
|
|
232
248
|
price: nil,
|
|
249
|
+
# A human-readable sentence for reason_code, for example "Insufficient balance".
|
|
250
|
+
# Omitted whenever reason_code is.
|
|
251
|
+
reason: nil,
|
|
252
|
+
# Why the message is at its current status, as a stable platform code such as
|
|
253
|
+
# DELIVERY_007, BUSINESS_003 or DELIVERY_003. Present when the current status is
|
|
254
|
+
# FAILED, FILTERED or BLOCKED and the lifecycle was loaded; omitted otherwise.
|
|
255
|
+
# Switch on this rather than on reason: the code is stable, the wording may be
|
|
256
|
+
# improved. It is the platform's classification of the outcome, never a carrier or
|
|
257
|
+
# vendor code.
|
|
258
|
+
reason_code: nil,
|
|
233
259
|
region_code: nil,
|
|
234
260
|
status: nil,
|
|
235
261
|
template_category: nil,
|
|
@@ -259,6 +285,8 @@ module Sentdm
|
|
|
259
285
|
phone: String,
|
|
260
286
|
phone_international: String,
|
|
261
287
|
price: T.nilable(Float),
|
|
288
|
+
reason: T.nilable(String),
|
|
289
|
+
reason_code: T.nilable(String),
|
|
262
290
|
region_code: String,
|
|
263
291
|
status: String,
|
|
264
292
|
template_category: T.nilable(String),
|
|
@@ -288,15 +316,39 @@ module Sentdm
|
|
|
288
316
|
sig { returns(T.nilable(String)) }
|
|
289
317
|
attr_accessor :description
|
|
290
318
|
|
|
319
|
+
# A human-readable sentence for reason_code. Omitted whenever reason_code is.
|
|
320
|
+
sig { returns(T.nilable(String)) }
|
|
321
|
+
attr_accessor :reason
|
|
322
|
+
|
|
323
|
+
# Why the message reached this status, as a stable platform code such as
|
|
324
|
+
# DELIVERY_007. Present on FAILED, FILTERED and BLOCKED events; omitted on every
|
|
325
|
+
# status that needs no explanation. Same wire name and vocabulary as on the
|
|
326
|
+
# activities list and the webhook.
|
|
327
|
+
sig { returns(T.nilable(String)) }
|
|
328
|
+
attr_accessor :reason_code
|
|
329
|
+
|
|
291
330
|
# Represents a status change event in a message's lifecycle (v3)
|
|
292
331
|
sig do
|
|
293
332
|
params(
|
|
294
333
|
status: String,
|
|
295
334
|
timestamp: Time,
|
|
296
|
-
description: T.nilable(String)
|
|
335
|
+
description: T.nilable(String),
|
|
336
|
+
reason: T.nilable(String),
|
|
337
|
+
reason_code: T.nilable(String)
|
|
297
338
|
).returns(T.attached_class)
|
|
298
339
|
end
|
|
299
|
-
def self.new(
|
|
340
|
+
def self.new(
|
|
341
|
+
status:,
|
|
342
|
+
timestamp:,
|
|
343
|
+
description: nil,
|
|
344
|
+
# A human-readable sentence for reason_code. Omitted whenever reason_code is.
|
|
345
|
+
reason: nil,
|
|
346
|
+
# Why the message reached this status, as a stable platform code such as
|
|
347
|
+
# DELIVERY_007. Present on FAILED, FILTERED and BLOCKED events; omitted on every
|
|
348
|
+
# status that needs no explanation. Same wire name and vocabulary as on the
|
|
349
|
+
# activities list and the webhook.
|
|
350
|
+
reason_code: nil
|
|
351
|
+
)
|
|
300
352
|
end
|
|
301
353
|
|
|
302
354
|
sig do
|
|
@@ -304,7 +356,9 @@ module Sentdm
|
|
|
304
356
|
{
|
|
305
357
|
status: String,
|
|
306
358
|
timestamp: Time,
|
|
307
|
-
description: T.nilable(String)
|
|
359
|
+
description: T.nilable(String),
|
|
360
|
+
reason: T.nilable(String),
|
|
361
|
+
reason_code: T.nilable(String)
|
|
308
362
|
}
|
|
309
363
|
)
|
|
310
364
|
end
|
|
@@ -571,38 +625,87 @@ module Sentdm
|
|
|
571
625
|
)
|
|
572
626
|
end
|
|
573
627
|
|
|
574
|
-
# One of
|
|
575
|
-
# fetched object's Content-Type
|
|
628
|
+
# One of MmsMediaTypes when the content type is known. Advisory — a reader should
|
|
629
|
+
# trust the fetched object's own Content-Type.
|
|
576
630
|
sig { returns(T.nilable(String)) }
|
|
577
631
|
attr_accessor :media_type
|
|
578
632
|
|
|
633
|
+
# Content type as the provider declared it. Null when it declared none.
|
|
579
634
|
sig { returns(T.nilable(String)) }
|
|
580
|
-
|
|
635
|
+
attr_accessor :mime_type
|
|
581
636
|
|
|
582
|
-
|
|
583
|
-
|
|
637
|
+
# Size as the provider declared it. Never measured here — nothing downloads the
|
|
638
|
+
# file.
|
|
639
|
+
sig { returns(T.nilable(Integer)) }
|
|
640
|
+
attr_accessor :size_bytes
|
|
584
641
|
|
|
585
|
-
#
|
|
586
|
-
#
|
|
642
|
+
# Inbound only: the SHA-256 the provider declared alongside the attachment, when
|
|
643
|
+
# it declared one. Relayed to the customer so they can verify what they fetch
|
|
644
|
+
# matches what the carrier said it sent. It is the only integrity signal available
|
|
645
|
+
# on an attachment nobody here has read.
|
|
646
|
+
sig { returns(T.nilable(String)) }
|
|
647
|
+
attr_accessor :source_hash_sha256
|
|
648
|
+
|
|
649
|
+
# Where the file lives. Outbound: the URL the customer gave us and the carrier
|
|
650
|
+
# fetched. Inbound: the URL the carrier hosts it at, relayed unchanged.
|
|
651
|
+
sig { returns(T.nilable(String)) }
|
|
652
|
+
attr_accessor :url
|
|
653
|
+
|
|
654
|
+
# One attachment on a message, in either direction — and in both, a URL somebody
|
|
655
|
+
# else hosts.
|
|
587
656
|
#
|
|
588
|
-
#
|
|
589
|
-
#
|
|
590
|
-
#
|
|
657
|
+
# Outbound: the customer supplied a public URL and we handed it to the carrier.
|
|
658
|
+
# Inbound: the carrier hosts the file and we record where. sent.dm never holds the
|
|
659
|
+
# bytes, so there is no key, no expiry bookkeeping and nothing minted per read —
|
|
660
|
+
# what is stored is what is served.
|
|
661
|
+
#
|
|
662
|
+
# An inbound link expires on the carrier's own schedule and is unauthenticated.
|
|
663
|
+
# That is the customer's to manage, and it is documented where they will see it
|
|
664
|
+
# rather than only here — a recipient who needs an attachment to outlive that
|
|
665
|
+
# window copies it on receipt.
|
|
666
|
+
#
|
|
667
|
+
# Storing a presigned URL is the specific mistake this shape still avoids:
|
|
668
|
+
# M260826130000 and M260826140000 exist because RCS assets were stored as signed
|
|
669
|
+
# URLs and went stale. Nothing here is signed.
|
|
591
670
|
sig do
|
|
592
|
-
params(
|
|
593
|
-
T.
|
|
594
|
-
|
|
671
|
+
params(
|
|
672
|
+
media_type: T.nilable(String),
|
|
673
|
+
mime_type: T.nilable(String),
|
|
674
|
+
size_bytes: T.nilable(Integer),
|
|
675
|
+
source_hash_sha256: T.nilable(String),
|
|
676
|
+
url: T.nilable(String)
|
|
677
|
+
).returns(T.attached_class)
|
|
595
678
|
end
|
|
596
679
|
def self.new(
|
|
597
|
-
# One of
|
|
598
|
-
# fetched object's Content-Type
|
|
680
|
+
# One of MmsMediaTypes when the content type is known. Advisory — a reader should
|
|
681
|
+
# trust the fetched object's own Content-Type.
|
|
599
682
|
media_type: nil,
|
|
683
|
+
# Content type as the provider declared it. Null when it declared none.
|
|
684
|
+
mime_type: nil,
|
|
685
|
+
# Size as the provider declared it. Never measured here — nothing downloads the
|
|
686
|
+
# file.
|
|
687
|
+
size_bytes: nil,
|
|
688
|
+
# Inbound only: the SHA-256 the provider declared alongside the attachment, when
|
|
689
|
+
# it declared one. Relayed to the customer so they can verify what they fetch
|
|
690
|
+
# matches what the carrier said it sent. It is the only integrity signal available
|
|
691
|
+
# on an attachment nobody here has read.
|
|
692
|
+
source_hash_sha256: nil,
|
|
693
|
+
# Where the file lives. Outbound: the URL the customer gave us and the carrier
|
|
694
|
+
# fetched. Inbound: the URL the carrier hosts it at, relayed unchanged.
|
|
600
695
|
url: nil
|
|
601
696
|
)
|
|
602
697
|
end
|
|
603
698
|
|
|
604
699
|
sig do
|
|
605
|
-
override.returns(
|
|
700
|
+
override.returns(
|
|
701
|
+
{
|
|
702
|
+
media_type: T.nilable(String),
|
|
703
|
+
mime_type: T.nilable(String),
|
|
704
|
+
size_bytes: T.nilable(Integer),
|
|
705
|
+
source_hash_sha256: T.nilable(String),
|
|
706
|
+
url: T.nilable(String)
|
|
707
|
+
}
|
|
708
|
+
)
|
|
606
709
|
end
|
|
607
710
|
def to_hash
|
|
608
711
|
end
|
|
@@ -23,13 +23,28 @@ module Sentdm
|
|
|
23
23
|
sig { params(account_id: String).void }
|
|
24
24
|
attr_writer :account_id
|
|
25
25
|
|
|
26
|
-
# The channel the message arrived on, for example sms or
|
|
26
|
+
# The channel the message arrived on, for example sms or mms.
|
|
27
27
|
sig { returns(T.nilable(String)) }
|
|
28
28
|
attr_reader :channel
|
|
29
29
|
|
|
30
30
|
sig { params(channel: String).void }
|
|
31
31
|
attr_writer :channel
|
|
32
32
|
|
|
33
|
+
# Attachments the contact sent, present only on channels that carry them (mms
|
|
34
|
+
# today) and omitted entirely otherwise.
|
|
35
|
+
#
|
|
36
|
+
# Each url points at the carrier's own copy of the file — sent.dm records where
|
|
37
|
+
# the attachment is, not the attachment itself. The link is unauthenticated and
|
|
38
|
+
# expires on the carrier's schedule, which differs between them: assume days, not
|
|
39
|
+
# months. Download what you need on receipt; re-reading the message through GET
|
|
40
|
+
# /v3/messages/{id} returns the same stored link, not a fresh one, so once it
|
|
41
|
+
# lapses the entry remains with whatever the carrier declared about the file but
|
|
42
|
+
# the file is no longer reachable.
|
|
43
|
+
sig do
|
|
44
|
+
returns(T.nilable(T::Array[Sentdm::InboundMessageEventPayload::Media]))
|
|
45
|
+
end
|
|
46
|
+
attr_accessor :media
|
|
47
|
+
|
|
33
48
|
# The inbound message.
|
|
34
49
|
sig { returns(T.nilable(String)) }
|
|
35
50
|
attr_reader :message_id
|
|
@@ -66,6 +81,10 @@ module Sentdm
|
|
|
66
81
|
received_at: String,
|
|
67
82
|
account_id: String,
|
|
68
83
|
channel: String,
|
|
84
|
+
media:
|
|
85
|
+
T.nilable(
|
|
86
|
+
T::Array[Sentdm::InboundMessageEventPayload::Media::OrHash]
|
|
87
|
+
),
|
|
69
88
|
message_id: String,
|
|
70
89
|
outbound_number: String,
|
|
71
90
|
text: T.nilable(String),
|
|
@@ -79,8 +98,19 @@ module Sentdm
|
|
|
79
98
|
received_at:,
|
|
80
99
|
# The account the message belongs to.
|
|
81
100
|
account_id: nil,
|
|
82
|
-
# The channel the message arrived on, for example sms or
|
|
101
|
+
# The channel the message arrived on, for example sms or mms.
|
|
83
102
|
channel: nil,
|
|
103
|
+
# Attachments the contact sent, present only on channels that carry them (mms
|
|
104
|
+
# today) and omitted entirely otherwise.
|
|
105
|
+
#
|
|
106
|
+
# Each url points at the carrier's own copy of the file — sent.dm records where
|
|
107
|
+
# the attachment is, not the attachment itself. The link is unauthenticated and
|
|
108
|
+
# expires on the carrier's schedule, which differs between them: assume days, not
|
|
109
|
+
# months. Download what you need on receipt; re-reading the message through GET
|
|
110
|
+
# /v3/messages/{id} returns the same stored link, not a fresh one, so once it
|
|
111
|
+
# lapses the entry remains with whatever the carrier declared about the file but
|
|
112
|
+
# the file is no longer reachable.
|
|
113
|
+
media: nil,
|
|
84
114
|
# The inbound message.
|
|
85
115
|
message_id: nil,
|
|
86
116
|
# Your number in E.164 format, meaning the number the message was addressed to.
|
|
@@ -102,6 +132,8 @@ module Sentdm
|
|
|
102
132
|
received_at: String,
|
|
103
133
|
account_id: String,
|
|
104
134
|
channel: String,
|
|
135
|
+
media:
|
|
136
|
+
T.nilable(T::Array[Sentdm::InboundMessageEventPayload::Media]),
|
|
105
137
|
message_id: String,
|
|
106
138
|
outbound_number: String,
|
|
107
139
|
text: T.nilable(String),
|
|
@@ -111,6 +143,82 @@ module Sentdm
|
|
|
111
143
|
end
|
|
112
144
|
def to_hash
|
|
113
145
|
end
|
|
146
|
+
|
|
147
|
+
class Media < Sentdm::Internal::Type::BaseModel
|
|
148
|
+
OrHash =
|
|
149
|
+
T.type_alias do
|
|
150
|
+
T.any(
|
|
151
|
+
Sentdm::InboundMessageEventPayload::Media,
|
|
152
|
+
Sentdm::Internal::AnyHash
|
|
153
|
+
)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# SHA-256 of the file as the carrier declared it, when it declares one. Verify
|
|
157
|
+
# what you download against this — sent.dm never reads the bytes, so it is the
|
|
158
|
+
# only integrity signal available.
|
|
159
|
+
sig { returns(T.nilable(String)) }
|
|
160
|
+
attr_accessor :hash_sha256
|
|
161
|
+
|
|
162
|
+
# Content type as the carrier reported it, for example image/jpeg.
|
|
163
|
+
sig { returns(T.nilable(String)) }
|
|
164
|
+
attr_accessor :mime_type
|
|
165
|
+
|
|
166
|
+
# Size in bytes as the carrier declared it. Absent when it declared none.
|
|
167
|
+
sig { returns(T.nilable(Integer)) }
|
|
168
|
+
attr_accessor :size_bytes
|
|
169
|
+
|
|
170
|
+
# Where the carrier hosts the attachment.
|
|
171
|
+
#
|
|
172
|
+
# This link expires and is not authenticated. sent.dm relays it rather than
|
|
173
|
+
# copying the file, so how long it stays fetchable is the carrier's decision and
|
|
174
|
+
# differs between them — assume days, not months. Anyone holding the URL can fetch
|
|
175
|
+
# it until it lapses. Copy the file on receipt if you need it to outlive that
|
|
176
|
+
# window; do not store this URL as a permanent reference.
|
|
177
|
+
sig { returns(T.nilable(String)) }
|
|
178
|
+
attr_accessor :url
|
|
179
|
+
|
|
180
|
+
# One attachment on an inbound message.
|
|
181
|
+
sig do
|
|
182
|
+
params(
|
|
183
|
+
hash_sha256: T.nilable(String),
|
|
184
|
+
mime_type: T.nilable(String),
|
|
185
|
+
size_bytes: T.nilable(Integer),
|
|
186
|
+
url: T.nilable(String)
|
|
187
|
+
).returns(T.attached_class)
|
|
188
|
+
end
|
|
189
|
+
def self.new(
|
|
190
|
+
# SHA-256 of the file as the carrier declared it, when it declares one. Verify
|
|
191
|
+
# what you download against this — sent.dm never reads the bytes, so it is the
|
|
192
|
+
# only integrity signal available.
|
|
193
|
+
hash_sha256: nil,
|
|
194
|
+
# Content type as the carrier reported it, for example image/jpeg.
|
|
195
|
+
mime_type: nil,
|
|
196
|
+
# Size in bytes as the carrier declared it. Absent when it declared none.
|
|
197
|
+
size_bytes: nil,
|
|
198
|
+
# Where the carrier hosts the attachment.
|
|
199
|
+
#
|
|
200
|
+
# This link expires and is not authenticated. sent.dm relays it rather than
|
|
201
|
+
# copying the file, so how long it stays fetchable is the carrier's decision and
|
|
202
|
+
# differs between them — assume days, not months. Anyone holding the URL can fetch
|
|
203
|
+
# it until it lapses. Copy the file on receipt if you need it to outlive that
|
|
204
|
+
# window; do not store this URL as a permanent reference.
|
|
205
|
+
url: nil
|
|
206
|
+
)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
sig do
|
|
210
|
+
override.returns(
|
|
211
|
+
{
|
|
212
|
+
hash_sha256: T.nilable(String),
|
|
213
|
+
mime_type: T.nilable(String),
|
|
214
|
+
size_bytes: T.nilable(Integer),
|
|
215
|
+
url: T.nilable(String)
|
|
216
|
+
}
|
|
217
|
+
)
|
|
218
|
+
end
|
|
219
|
+
def to_hash
|
|
220
|
+
end
|
|
221
|
+
end
|
|
114
222
|
end
|
|
115
223
|
end
|
|
116
224
|
end
|