+2
Gemfile
+2
Gemfile
+4
Gemfile.lock
+4
Gemfile.lock
···
15
15
public_suffix (>= 2.0.2, < 6.0)
16
16
bigdecimal (3.1.7)
17
17
buftok (0.3.0)
18
+
didkit (0.2.0)
18
19
domain_name (0.6.20240107)
19
20
ffi (1.16.3)
20
21
ffi-compiler (1.3.2)
···
32
33
ffi-compiler (>= 1.0, < 2.0)
33
34
io-console (0.7.2)
34
35
json (2.7.1)
36
+
minisky (0.3.1)
35
37
net-http (0.4.1)
36
38
uri
37
39
oj (3.16.3)
···
46
48
ruby
47
49
48
50
DEPENDENCIES
51
+
didkit (~> 0.2)
49
52
io-console (~> 0.5)
50
53
json (~> 2.5)
51
54
mastodon-api!
55
+
minisky (~> 0.3)
52
56
net-http (~> 0.2)
53
57
uri (~> 0.13)
54
58
yaml (~> 0.1)
+20
app/bluesky_account.rb
+20
app/bluesky_account.rb
···
1
+
require 'didkit'
2
+
require_relative 'bluesky_client'
3
+
4
+
class BlueskyAccount
5
+
def login_with_password(handle, password)
6
+
did = DID.resolve_handle(handle)
7
+
if did.nil?
8
+
puts "Error: couldn't resolve handle #{handle.inspect}"
9
+
exit 1
10
+
end
11
+
12
+
pds = did.get_document.pds_endpoint.gsub('https://', '')
13
+
14
+
sky = BlueskyClient.new
15
+
sky.host = pds
16
+
sky.user.id = handle
17
+
sky.user.pass = password
18
+
sky.log_in
19
+
end
20
+
end
+26
app/bluesky_client.rb
+26
app/bluesky_client.rb
···
1
+
require 'minisky'
2
+
require 'yaml'
3
+
4
+
class BlueskyClient
5
+
include Minisky::Requests
6
+
7
+
CONFIG_FILE = File.expand_path(File.join(__dir__, '..', 'config', 'bluesky.yml'))
8
+
9
+
attr_reader :config
10
+
11
+
def initialize
12
+
@config = File.exist?(CONFIG_FILE) ? YAML.load(File.read(CONFIG_FILE)) : {}
13
+
end
14
+
15
+
def host
16
+
@config['host']
17
+
end
18
+
19
+
def host=(h)
20
+
@config['host'] = h
21
+
end
22
+
23
+
def save_config
24
+
File.write(CONFIG_FILE, YAML.dump(@config))
25
+
end
26
+
end
+11
-1
app/tootify.rb
+11
-1
app/tootify.rb
···
1
1
require 'io/console'
2
+
3
+
require_relative 'bluesky_account'
2
4
require_relative 'mastodon_account'
3
5
4
6
class Tootify
5
7
def initialize
8
+
@bluesky = BlueskyAccount.new
6
9
@mastodon = MastodonAccount.new
7
10
end
8
11
9
-
def login_bluesky
12
+
def login_bluesky(handle)
13
+
handle = handle.gsub(/^@/, '')
14
+
15
+
print "App password: "
16
+
password = STDIN.noecho(&:gets).chomp
17
+
puts
18
+
19
+
@bluesky.login_with_password(handle, password)
10
20
end
11
21
12
22
def login_mastodon(handle)