hulaki 0.1 → 1.0.2
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/Gemfile.lock +17 -7
- data/README.md +74 -20
- data/hulaki.gemspec +23 -16
- data/images/hulaki.png +0 -0
- data/lib/hulaki.rb +8 -76
- data/lib/hulaki/config/config.rb +22 -22
- data/lib/hulaki/config/sample.config.yml +34 -0
- data/lib/hulaki/config/sample.contact.csv +4 -0
- data/lib/hulaki/config/sample.template.html.erb +10 -0
- data/lib/hulaki/contact_parser.rb +9 -13
- data/lib/hulaki/core.rb +90 -0
- data/lib/hulaki/{email_validator.rb → email_handler/email_validator.rb} +3 -3
- data/lib/hulaki/email_handler/mailer.rb +73 -0
- data/lib/hulaki/option_parser.rb +77 -67
- data/lib/hulaki/presenter.rb +15 -9
- data/lib/hulaki/recursive_ostruct.rb +12 -0
- data/lib/hulaki/search_engine.rb +19 -10
- data/lib/hulaki/sms_handler/gateway_adapters/nexmo.rb +21 -0
- data/lib/hulaki/sms_handler/gateway_adapters/twilio.rb +8 -19
- data/lib/hulaki/sms_handler/sms_handler.rb +23 -14
- data/lib/hulaki/sms_handler/sms_validator.rb +3 -8
- data/lib/hulaki/string_modifier.rb +4 -0
- data/lib/hulaki/utils.rb +76 -0
- data/lib/hulaki/version.rb +1 -1
- metadata +79 -19
- data/lib/hulaki/config/config_sample.yml +0 -25
- data/lib/hulaki/mailer.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 223e8463666e7cd5c69f339d512680d597e6f858
|
4
|
+
data.tar.gz: 9d816a3224a76434bcd38c55919f72f2c5156842
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5837855f6497d7122e460ebb9ed7a8ca13a8197d4ea771ab49a08c26bdfac7ad2d938d79495e1daf23670e4fff271de30518ff34c485ae757684e127033fca9a
|
7
|
+
data.tar.gz: 84e1f9ced65e653e8b6e5528fc3648f8fdc039488945e2bffdb18b00f4d796840fb652a29cb1067d91031b80b36ff9ac4c42f9db0933fe7bbc45fa275ad1a83e
|
data/Gemfile.lock
CHANGED
@@ -1,17 +1,22 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
hulaki (
|
5
|
-
amatch
|
6
|
-
|
4
|
+
hulaki (1.1)
|
5
|
+
amatch (~> 0.3.1)
|
6
|
+
clipboard (= 1.1.0)
|
7
|
+
mail (~> 2.6.3)
|
8
|
+
nexmo (~> 4.6.0)
|
9
|
+
smarter_csv (= 1.1.0)
|
10
|
+
terminal-table (= 1.8.0)
|
7
11
|
twilio-ruby (~> 4.11.1)
|
8
12
|
|
9
13
|
GEM
|
10
14
|
remote: https://rubygems.org/
|
11
15
|
specs:
|
12
|
-
amatch (0.3.
|
16
|
+
amatch (0.3.1)
|
13
17
|
tins (~> 1.0)
|
14
|
-
builder (3.2.
|
18
|
+
builder (3.2.3)
|
19
|
+
clipboard (1.1.0)
|
15
20
|
coderay (1.1.1)
|
16
21
|
diff-lcs (1.2.5)
|
17
22
|
jwt (1.5.6)
|
@@ -20,6 +25,8 @@ GEM
|
|
20
25
|
method_source (0.8.2)
|
21
26
|
mime-types (2.99)
|
22
27
|
multi_json (1.12.1)
|
28
|
+
nexmo (4.6.0)
|
29
|
+
jwt
|
23
30
|
pry (0.10.3)
|
24
31
|
coderay (~> 1.1.0)
|
25
32
|
method_source (~> 0.8.1)
|
@@ -40,11 +47,14 @@ GEM
|
|
40
47
|
rspec-support (3.5.0)
|
41
48
|
slop (3.6.0)
|
42
49
|
smarter_csv (1.1.0)
|
43
|
-
|
50
|
+
terminal-table (1.8.0)
|
51
|
+
unicode-display_width (~> 1.1, >= 1.1.1)
|
52
|
+
tins (1.14.0)
|
44
53
|
twilio-ruby (4.11.1)
|
45
54
|
builder (>= 2.1.2)
|
46
55
|
jwt (~> 1.0)
|
47
56
|
multi_json (>= 1.3.0)
|
57
|
+
unicode-display_width (1.2.1)
|
48
58
|
|
49
59
|
PLATFORMS
|
50
60
|
ruby
|
@@ -58,4 +68,4 @@ DEPENDENCIES
|
|
58
68
|
rspec
|
59
69
|
|
60
70
|
BUNDLED WITH
|
61
|
-
1.
|
71
|
+
1.15.0
|
data/README.md
CHANGED
@@ -4,7 +4,8 @@
|
|
4
4
|
[](https://codeclimate.com/github/shivabhusal/hulaki)
|
5
5
|
[ ](https://codeship.com/projects/135625)
|
6
6
|
|
7
|
-
#### Hulaki is a CLI tool to search contact details from your CSV file.
|
7
|
+
#### Hulaki is a CLI tool to search contact details from your CSV file and sending easy SMS and Emails with single command.
|
8
|
+

|
8
9
|
|
9
10
|
Hulaki makes communication easier by providing ability to search through the contact list. The CLI tool also allows sending direct SMS and/or email to desired person in contact list
|
10
11
|
|
@@ -18,40 +19,94 @@ Install this in your system using command.
|
|
18
19
|
- Make sure to install this in your default ruby-version gemset. Other wise you may not be able to use the command from anywhere in your terminal emulator.
|
19
20
|
- Or install in every ruby-version gemset; to make the command `$ hulaki` accessible from anywhere.
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
$ hulaki -h
|
25
|
-
$ hulaki --help
|
26
|
-
```
|
27
|
-
### Search phone number or other contact detail
|
22
|
+
|
23
|
+
## Usage:
|
24
|
+
### Search
|
28
25
|
```bash
|
29
26
|
$ hulaki -s search-string
|
30
27
|
# Example: Hulaki features fuzzy search
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
```
|
28
|
+
# $ hulaki -s smithjohn
|
29
|
+
# $ hulaki -s johsmith
|
30
|
+
# $ hulaki -s smijohnth
|
35
31
|
|
36
|
-
|
37
|
-
|
32
|
+
```
|
33
|
+
**Example Output**
|
34
|
+
```
|
35
|
+
$ hulaki -s 'jhn'
|
36
|
+
+-----+--------------------------------+------------+------------+--------------------+
|
37
|
+
| Hulaki 1.0 |
|
38
|
+
+-----+--------------------------------+------------+------------+--------------------+
|
39
|
+
| S.N | Name | Phone 1 | Phone 2 | Email |
|
40
|
+
+-----+--------------------------------+------------+------------+--------------------+
|
41
|
+
| 1 | John Bhusal | 984xxx8271 | | hisemail@gmail.com |
|
42
|
+
| 2 | Joe Dhakal | 984xxx8627 | 980xxx1820 | |
|
43
|
+
| 3 | Jhalak Parajuli | 985xxx3695 | | |
|
44
|
+
| 4 | Jonathan Dai Subedi | 984xxx4397 | | |
|
45
|
+
+-----+--------------------------------+------------+------------+--------------------+
|
38
46
|
|
39
47
|
```
|
48
|
+
### SMS
|
49
|
+
```bash
|
40
50
|
$ hulaki -t +977xxxxxxxxxx -m "Message to be sent"
|
51
|
+
|
52
|
+
# You can even select a specific SMS Gateway
|
53
|
+
$ hulaki -t +977xxxxxxxxxx -m "Message to be sent" -g nexmo
|
54
|
+
$ hulaki -t +61xxxxxxxxxx -m "Message to be sent" -g twilio
|
55
|
+
$ hulaki -t +1xxxxxxxxxx -m "Message to be sent" -g sparrow
|
56
|
+
|
57
|
+
# You can even broadcast SMSes selecting a specific SMS Gateway
|
58
|
+
# However, keep in mind that multiple SMS request will go to the server
|
59
|
+
$ hulaki -t +977xxxxxxxxxx,+9779832xxxxxx -m "Message to be sent" -g nexmo
|
60
|
+
|
61
|
+
# You can also change the name that appears on recipient's Phone using `-f` switch. This only works with Nexmo
|
62
|
+
$ hulaki -t +977xxxxxxxxxx,+9779832xxxxxx -m "Message to be sent" -g nexmo -f "Hero Dai!"
|
63
|
+
|
64
|
+
```
|
65
|
+
|
66
|
+
### EMail
|
67
|
+
```bash
|
68
|
+
$ hulaki -t someone@example.com -S "Subject of the email" -m "Message to be sent"
|
69
|
+
$ hulaki -t someone@example.com --subject "Subject of the email" -m "Message to be sent"
|
70
|
+
|
71
|
+
# You can even broadcast emails, i.e. mutiple recipients
|
72
|
+
# However, keep in mind that multiple SMTP request will go to the server. No `CC`, `BCC` will be used
|
73
|
+
$ hulaki -t someone@example.com,nextperson@email.com --subject "Subject of the email" -m "Message to be sent"
|
74
|
+
|
75
|
+
# You can also change your sender id using `-f` switch
|
76
|
+
$ hulaki -t someone@example.com -S "Subject of the email" -m "Message to be sent" -f "My Name<anonymous@example.com>"
|
77
|
+
```
|
78
|
+
|
79
|
+
### Email Templates/Layouts
|
80
|
+
You are allowed to have an Email template in HTML format at `~/hulaki/template.html.erb` which will be copied when you use `-i` switch. If you have `use_template` setting set to `true` then only you will be able to use the template. Templates are like `Layouts` in Rails.
|
81
|
+
```bash
|
82
|
+
$ hulaki -t someone@example.com -S "Subject of the email" -m "Message to be sent"
|
83
|
+
```
|
84
|
+
|
85
|
+
### Specific options:
|
86
|
+
```bash
|
87
|
+
-t, --to x,y,z list of recipient, can be
|
88
|
+
-m, --message [Message] Message to be sent to recipient
|
89
|
+
-S, --subject [Subject] Subject to email
|
90
|
+
-g, --gateway [Gateway Name] Name of the gateway, `nexmo`, `twilio`, `sparrow` are currently supported
|
91
|
+
-f, --from [Sender] name <email> | PhoneNumber; this will take precedence over `from` in `config.yml`.
|
92
|
+
-s, --search [name/contact] Search keyword
|
93
|
+
-h, --help Help / Examples
|
94
|
+
-l, --list list all the options available
|
95
|
+
-i, --install Creates ~/hulaki/config.yml, `template.html.erb`. Will ask you if have to replace them
|
41
96
|
```
|
42
97
|
|
43
98
|
## Configuration
|
44
|
-
- `Hulaki` requires the file `~/hulaki/contact.csv` to be present.
|
99
|
+
- `Hulaki` requires the file `~/hulaki/contact.csv` to be present.
|
45
100
|
- The file must be a valid `CSV` file.
|
46
|
-
- When you install the gem, a sample config
|
47
|
-
- You need to update
|
48
|
-
|
101
|
+
- When you install the gem, a sample config and template filea are copied to `~/hulaki/`
|
102
|
+
- You need to update the template per requirement.
|
103
|
+
- You need to update your SMS gateway(eg. `Twilio`, `nexmo`) creds
|
104
|
+
- `Hulaki` only supports `Twilio` and `nexmo` at the moment.
|
49
105
|
- Also, update the SMTP settings accordingly
|
50
106
|
|
51
107
|
---
|
52
108
|
|
53
109
|
## Development
|
54
|
-
|
55
110
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
56
111
|
|
57
112
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
@@ -64,4 +119,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/shivab
|
|
64
119
|
## License
|
65
120
|
|
66
121
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
67
|
-
|
data/hulaki.gemspec
CHANGED
@@ -4,13 +4,13 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'hulaki/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name
|
8
|
-
spec.version
|
9
|
-
spec.authors
|
10
|
-
spec.email
|
7
|
+
spec.name = 'hulaki'
|
8
|
+
spec.version = Hulaki::VERSION
|
9
|
+
spec.authors = ['Shiva Bhusal']
|
10
|
+
spec.email = ['hotline.shiva@gmail.com']
|
11
11
|
|
12
|
-
spec.summary
|
13
|
-
exported already in CSV format.}
|
12
|
+
spec.summary = %q{Hulaki is basically a CLI tool to search contact details \
|
13
|
+
exported already in CSV format, send SMS and Emails in a single command.}
|
14
14
|
|
15
15
|
spec.description = %Q{We developers don't have time to grab mobile phones, \
|
16
16
|
slide the screen, press pin numbers, open contact list \
|
@@ -20,18 +20,25 @@ Gem::Specification.new do |spec|
|
|
20
20
|
search the contact details and send message if we like.}
|
21
21
|
|
22
22
|
spec.homepage = 'https://github.com/shivabhusal/hulaki'
|
23
|
-
spec.license
|
23
|
+
spec.license = 'MIT'
|
24
24
|
|
25
|
-
spec.files
|
26
|
-
spec.bindir
|
27
|
-
spec.executables
|
28
|
-
spec.require_paths
|
25
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
26
|
+
spec.bindir = 'exe'
|
27
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
28
|
+
spec.require_paths = ['lib']
|
29
29
|
|
30
|
-
spec.add_development_dependency 'bundler',
|
31
|
-
spec.add_development_dependency 'rake',
|
30
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
31
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
32
32
|
spec.add_development_dependency 'pry'
|
33
33
|
spec.add_development_dependency 'rspec'
|
34
|
-
|
35
|
-
spec.add_runtime_dependency '
|
36
|
-
spec.add_runtime_dependency '
|
34
|
+
|
35
|
+
spec.add_runtime_dependency 'amatch', '~> 0.3.1'
|
36
|
+
spec.add_runtime_dependency 'twilio-ruby', '~> 4.11.1'
|
37
|
+
spec.add_runtime_dependency 'nexmo', '~> 4.6.0'
|
38
|
+
spec.add_runtime_dependency 'mail', '~> 2.6.3'
|
39
|
+
spec.add_runtime_dependency 'smarter_csv', '1.1.0'
|
40
|
+
spec.add_runtime_dependency 'terminal-table', '1.8.0'
|
41
|
+
spec.add_runtime_dependency 'clipboard', '1.1.0'
|
42
|
+
|
43
|
+
spec.post_install_message = 'Please run `$ hulaki -i` to install Configuration files so that you can modify later'
|
37
44
|
end
|
data/images/hulaki.png
ADDED
Binary file
|
data/lib/hulaki.rb
CHANGED
@@ -1,78 +1,10 @@
|
|
1
|
-
require 'hulaki/version'
|
2
|
-
|
3
|
-
require '
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require 'smarter_csv'
|
8
|
-
require 'twilio-ruby'
|
9
|
-
require 'pry'
|
10
|
-
require 'hulaki/option_parser'
|
11
|
-
require 'hulaki/sms_handler/sms_handler'
|
12
|
-
require 'hulaki/sms_handler/sms_validator'
|
13
|
-
require 'hulaki/sms_handler/gateway_adapters/twilio'
|
14
|
-
require 'hulaki/sms_handler/gateway_adapters/sparrow'
|
15
|
-
require 'hulaki/config/config'
|
16
|
-
require 'hulaki/exceptions'
|
17
|
-
require 'hulaki/email_validator'
|
18
|
-
require 'hulaki/mailer'
|
19
|
-
require 'hulaki/logger'
|
20
|
-
require 'mail'
|
21
|
-
|
22
|
-
class Hulaki::Core
|
23
|
-
def initialize(config)
|
24
|
-
@config = config
|
25
|
-
end
|
26
|
-
|
27
|
-
def perform
|
28
|
-
puts '~' * 100
|
29
|
-
puts 'Welcome to Hulaki : Your best companion! to make your day great.'
|
30
|
-
puts '~' * 100
|
31
|
-
|
32
|
-
@config.to.each do |recipient|
|
33
|
-
if is_phone?(recipient)
|
34
|
-
handle_sms(recipient)
|
35
|
-
elsif is_email?(recipient)
|
36
|
-
handle_email(recipient)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
puts '~' * 100
|
41
|
-
puts @config.message
|
42
|
-
puts '~' * 100
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
def is_phone?(number)
|
49
|
-
Hulaki::SmsValidator.is_phone_number?(number)
|
50
|
-
end
|
51
|
-
|
52
|
-
def is_email?(email)
|
53
|
-
Hulaki::EmailValidator.is_email?(email)
|
54
|
-
end
|
1
|
+
require 'hulaki/version.rb'
|
2
|
+
begin
|
3
|
+
require 'pry'
|
4
|
+
rescue LoadError
|
5
|
+
# No matter if its production
|
6
|
+
end
|
55
7
|
|
56
|
-
def handle_email(recipient)
|
57
|
-
puts "Sending email to #{recipient}"
|
58
|
-
email_handler = Hulaki::Mailer.new(
|
59
|
-
{
|
60
|
-
to: recipient,
|
61
|
-
body: @config.message,
|
62
|
-
sub: @config.subject,
|
63
|
-
})
|
64
|
-
puts "Email sent to #{recipient}."
|
65
|
-
end
|
66
8
|
|
67
|
-
|
68
|
-
|
69
|
-
sms_handler = Hulaki::SmsHandler.new(
|
70
|
-
{
|
71
|
-
to: recipient,
|
72
|
-
message: @config.message
|
73
|
-
})
|
74
|
-
if sms_handler.send
|
75
|
-
puts "SMS sent successfully to #{recipient}"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
9
|
+
path = File.expand_path('../hulaki/', __FILE__)
|
10
|
+
Dir["#{path}/**/*.rb"].each{ |f| require f }
|
data/lib/hulaki/config/config.rb
CHANGED
@@ -1,35 +1,35 @@
|
|
1
|
+
require 'smarter_csv'
|
1
2
|
require 'yaml'
|
2
3
|
require 'erb'
|
4
|
+
|
3
5
|
class Hulaki::Config
|
4
|
-
ConfigPath
|
5
|
-
SampleConfigPath
|
6
|
-
|
7
|
-
|
6
|
+
ConfigPath = '~/hulaki/config.yml'
|
7
|
+
SampleConfigPath = File.expand_path('../sample.config.yml', __FILE__)
|
8
|
+
SampleContactPath = File.expand_path('../sample.contact.csv', __FILE__)
|
9
|
+
SampleTemplatePath = File.expand_path('../sample.template.html.erb', __FILE__)
|
8
10
|
|
9
|
-
|
10
|
-
@file_path = File.expand_path(params.fetch(:path, @@config_file_path))
|
11
|
-
end
|
11
|
+
@@config_file_path = File.expand_path(ConfigPath)
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
class << self
|
14
|
+
def [](key)
|
15
|
+
config[key]
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
+
def config_file_path=(config_file_path)
|
19
|
+
@@config_file_path = File.expand_path(config_file_path)
|
20
|
+
end
|
18
21
|
|
19
|
-
|
20
|
-
read_file = File.open(@file_path).read
|
21
|
-
YAML.load(ERB.new(read_file).result)
|
22
|
-
rescue Errno::ENOENT => e
|
23
|
-
raise Hulaki::InvalidFilePath, 'Invalid file.'
|
24
|
-
end
|
22
|
+
private
|
25
23
|
|
26
|
-
|
27
|
-
|
28
|
-
@@config_file_path = config_file_path
|
24
|
+
def config
|
25
|
+
@@config ||= parse
|
29
26
|
end
|
30
27
|
|
31
|
-
def
|
32
|
-
@@config_file_path
|
28
|
+
def parse
|
29
|
+
read_file = File.open(@@config_file_path ).read
|
30
|
+
YAML.load(ERB.new(read_file).result)
|
31
|
+
rescue Errno::ENOENT => e
|
32
|
+
raise Hulaki::InvalidFilePath, 'Invalid file.'
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
sms:
|
2
|
+
# The later config will override the former one
|
3
|
+
# To have multiple config and switch between them, comment the not used one
|
4
|
+
twilio:
|
5
|
+
default: true
|
6
|
+
API_KEY: ACf43b1e6876as8d7a6sd27515ea49e418
|
7
|
+
API_SECRET: 75768435c30daeef519439kjhkjahsdk
|
8
|
+
ACCOUNT_PHONE_NUMBER: +150447566666
|
9
|
+
|
10
|
+
nexmo:
|
11
|
+
API_KEY: ACf43b1e6167987123jhkhkhkjjj49e418
|
12
|
+
API_SECRET: 75768435c30daeef519439c123123123f
|
13
|
+
ACCOUNT_PHONE_NUMBER: +154444451701
|
14
|
+
|
15
|
+
sparrow:
|
16
|
+
API_KEY: ACf43b1e6167987123jhkhkhkjjj49e418
|
17
|
+
API_SECRET: 75768435c30daeef519439c123123123f
|
18
|
+
ACCOUNT_PHONE_NUMBER: +154444451701
|
19
|
+
from: Your Name
|
20
|
+
|
21
|
+
email:
|
22
|
+
delivery_method: smtp
|
23
|
+
address: smtp.gmail.com
|
24
|
+
port: 587
|
25
|
+
domain: gmail.com
|
26
|
+
user_name: youremail@gmail.com
|
27
|
+
password: p@ssword123
|
28
|
+
authentication: plain
|
29
|
+
from: your_name <your_email@example.com>
|
30
|
+
# This feature will let you use a template stored in `~/hulaki/template.`
|
31
|
+
use_template: true
|
32
|
+
|
33
|
+
search:
|
34
|
+
no_of_results: 10
|
@@ -0,0 +1,4 @@
|
|
1
|
+
Name,First Name,Last Name,Phone 1 - Type,Phone 1 - Value,Phone 2 - Type,Phone 2 - Value,Address 1 - Type,Address 1 - Formatted
|
2
|
+
Shiva Bhusal,Shiva,Bhusal,Mobile,9843488889,Home,034567238,Home,Kathmandu-Dhobikhola
|
3
|
+
Shiva Gaire,Shiva,Gaire,Mobile,9843488889,Home,034567238,Home,Kathmandu-Dhobikhola
|
4
|
+
Yubraj Acharya,Yubraj,Acharya,Mobile,9843488867,Home,034563338,Home,Kathmandu-Dhobikhola
|