legion_mastodon_client 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a10d72d4ccffd88e27658515cae24e3091aab96d062c8455d4e307d1361126b3
4
- data.tar.gz: e0d0c22a21ec9a7267f1d14e9282a448826014168ddbd9a43d7f85501036ae09
3
+ metadata.gz: dd45906fe3d5c1e0efa624dc6484489188fc0bb8b5b440ce28f18e561c2c1fd6
4
+ data.tar.gz: ffb4371c000b14127cef76f392256515479ba0f1627676afdaf5847050bb53a7
5
5
  SHA512:
6
- metadata.gz: b5b7e8dc3d266115920cb227b5d482f1ebc9b565d015607b018413c19337fdac29bae884851f1f3af1e65050b872ead1e8ccaf53773a596668efb9aed5a33dd9
7
- data.tar.gz: c6d24bbf2b7b41799d88dde267bc6d9c3fcdaa29109fd3e5a33895857e3060985c91ea98d23428bda83f0df5383718f7b87105beb3a2af0b76ec27b3b7e19a89
6
+ metadata.gz: 80e4c2498d4b7d16645a633758734b0119252eee6031362fe43fc0ad1462b70d6f38f8815ed68355c6e0cb593ce852f71e65030da1956507ba7a763a0fe8b974
7
+ data.tar.gz: 63d6267fd3b12561a4e7b0f7a57fe91c4fbb6c56d0f4a12ca44a80cc1f4800bdf51b54e4ff9dedb6d1ae7ebd489707aff81e0f4d902650ba4306289c3acee2b7
data/.env.sample CHANGED
@@ -1,2 +1,2 @@
1
- MASTODON_URL=
1
+ MASTODON_URL=
2
2
  MASTODON_TOKEN=
data/.gitignore CHANGED
@@ -1,12 +1,17 @@
1
- .env
2
- /.bundle/
3
- /.yardoc
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
-
11
- # rspec failure tracking
12
- .rspec_status
1
+ .env
2
+ /.bundle/
3
+ /.yardoc
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
13
+
14
+ /lib/legion/.env
15
+ /lib/legion/test.rb
16
+ /lib/legion/Gemfile
17
+ /lib/legion/Gemfile.lock
data/Gemfile CHANGED
@@ -1,13 +1,14 @@
1
- source "https://rubygems.org"
2
-
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
-
5
- gem 'mastodon-api', git: 'https://github.com/tootsuite/mastodon-api.git', ref: '189deb8'
6
- gem 'dotenv'
7
- gem "highline"
8
- gem 'nokogiri'
9
- gem 'rmagick'
10
- gem 'parallel'
11
-
12
- # Specify your gem's dependencies in legion.gemspec
13
- gemspec
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ gem 'mastodon-api', git: 'https://github.com/tootsuite/mastodon-api.git', ref: '189deb8'
6
+ gem 'dotenv'
7
+ gem "highline"
8
+ gem 'nokogiri'
9
+ gem 'rmagick'
10
+ gem 'parallel'
11
+ gem 'tk'
12
+
13
+ # Specify your gem's dependencies in legion.gemspec
14
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,78 +1,84 @@
1
- GIT
2
- remote: https://github.com/tootsuite/mastodon-api.git
3
- revision: 189deb8219ae1ce7c34386d9ad1ca7e4a5fec62c
4
- ref: 189deb8
5
- specs:
6
- mastodon-api (1.2.0)
7
- addressable (~> 2.5)
8
- buftok
9
- http (~> 3.0)
10
- oj (~> 3.3)
11
-
12
- PATH
13
- remote: .
14
- specs:
15
- legion (0.1.0)
16
-
17
- GEM
18
- remote: https://rubygems.org/
19
- specs:
20
- addressable (2.5.2)
21
- public_suffix (>= 2.0.2, < 4.0)
22
- buftok (0.2.0)
23
- diff-lcs (1.3)
24
- domain_name (0.5.20180417)
25
- unf (>= 0.0.5, < 1.0.0)
26
- dotenv (2.4.0)
27
- highline (1.7.10)
28
- http (3.3.0)
29
- addressable (~> 2.3)
30
- http-cookie (~> 1.0)
31
- http-form_data (~> 2.0)
32
- http_parser.rb (~> 0.6.0)
33
- http-cookie (1.0.3)
34
- domain_name (~> 0.5)
35
- http-form_data (2.1.1)
36
- http_parser.rb (0.6.0)
37
- mini_portile2 (2.3.0)
38
- nokogiri (1.8.2-x86-mingw32)
39
- mini_portile2 (~> 2.3.0)
40
- oj (3.6.2)
41
- parallel (1.12.1)
42
- public_suffix (3.0.2)
43
- rake (10.5.0)
44
- rmagick (2.16.0)
45
- rspec (3.7.0)
46
- rspec-core (~> 3.7.0)
47
- rspec-expectations (~> 3.7.0)
48
- rspec-mocks (~> 3.7.0)
49
- rspec-core (3.7.1)
50
- rspec-support (~> 3.7.0)
51
- rspec-expectations (3.7.0)
52
- diff-lcs (>= 1.2.0, < 2.0)
53
- rspec-support (~> 3.7.0)
54
- rspec-mocks (3.7.0)
55
- diff-lcs (>= 1.2.0, < 2.0)
56
- rspec-support (~> 3.7.0)
57
- rspec-support (3.7.1)
58
- unf (0.1.4)
59
- unf_ext
60
- unf_ext (0.0.7.5-x86-mingw32)
61
-
62
- PLATFORMS
63
- x86-mingw32
64
-
65
- DEPENDENCIES
66
- bundler (~> 1.16)
67
- dotenv
68
- highline
69
- legion!
70
- mastodon-api!
71
- nokogiri
72
- parallel
73
- rake (~> 10.0)
74
- rmagick
75
- rspec (~> 3.0)
76
-
77
- BUNDLED WITH
78
- 1.16.2
1
+ GIT
2
+ remote: https://github.com/tootsuite/mastodon-api.git
3
+ revision: 189deb8219ae1ce7c34386d9ad1ca7e4a5fec62c
4
+ ref: 189deb8
5
+ specs:
6
+ mastodon-api (1.2.0)
7
+ addressable (~> 2.5)
8
+ buftok
9
+ http (~> 3.0)
10
+ oj (~> 3.3)
11
+
12
+ PATH
13
+ remote: .
14
+ specs:
15
+ legion_mastodon_client (0.1.0)
16
+
17
+ GEM
18
+ remote: https://rubygems.org/
19
+ specs:
20
+ addressable (2.5.2)
21
+ public_suffix (>= 2.0.2, < 4.0)
22
+ buftok (0.2.0)
23
+ diff-lcs (1.3)
24
+ domain_name (0.5.20180417)
25
+ unf (>= 0.0.5, < 1.0.0)
26
+ dotenv (2.4.0)
27
+ highline (1.7.10)
28
+ http (3.3.0)
29
+ addressable (~> 2.3)
30
+ http-cookie (~> 1.0)
31
+ http-form_data (~> 2.0)
32
+ http_parser.rb (~> 0.6.0)
33
+ http-cookie (1.0.3)
34
+ domain_name (~> 0.5)
35
+ http-form_data (2.1.1)
36
+ http_parser.rb (0.6.0)
37
+ mini_portile2 (2.3.0)
38
+ nokogiri (1.8.2)
39
+ mini_portile2 (~> 2.3.0)
40
+ nokogiri (1.8.2-x86-mingw32)
41
+ mini_portile2 (~> 2.3.0)
42
+ oj (3.6.2)
43
+ parallel (1.12.1)
44
+ public_suffix (3.0.2)
45
+ rake (10.5.0)
46
+ rmagick (2.16.0)
47
+ rspec (3.7.0)
48
+ rspec-core (~> 3.7.0)
49
+ rspec-expectations (~> 3.7.0)
50
+ rspec-mocks (~> 3.7.0)
51
+ rspec-core (3.7.1)
52
+ rspec-support (~> 3.7.0)
53
+ rspec-expectations (3.7.0)
54
+ diff-lcs (>= 1.2.0, < 2.0)
55
+ rspec-support (~> 3.7.0)
56
+ rspec-mocks (3.7.0)
57
+ diff-lcs (>= 1.2.0, < 2.0)
58
+ rspec-support (~> 3.7.0)
59
+ rspec-support (3.7.1)
60
+ tk (0.2.0)
61
+ unf (0.1.4)
62
+ unf_ext
63
+ unf_ext (0.0.7.5)
64
+ unf_ext (0.0.7.5-x86-mingw32)
65
+
66
+ PLATFORMS
67
+ ruby
68
+ x86-mingw32
69
+
70
+ DEPENDENCIES
71
+ bundler (~> 1.16)
72
+ dotenv
73
+ highline
74
+ legion_mastodon_client!
75
+ mastodon-api!
76
+ nokogiri
77
+ parallel
78
+ rake (~> 10.0)
79
+ rmagick
80
+ rspec (~> 3.0)
81
+ tk
82
+
83
+ BUNDLED WITH
84
+ 1.16.2
data/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2018 S.H.
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2018 S.H.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,26 +1,64 @@
1
- # Legion
2
- ## 概要
3
- Ruby/Tk を使用して制作されたMastodonクライアントアプリっぽいものです。
4
-
5
- ## 使い方
6
- `.env.sample` を `.env` にリネームし、必要な環境変数を記入していくだけです。
7
-
8
- ```
9
- MASTODON_URL=<インスタンスのURL>
10
- MASTODON_TOKEN=<インスタンスで発行したアクセストークン>
11
- ```
12
-
13
- あとは、以下のコマンドでLegionのUIを起動させるだけです。
14
-
15
- ```
16
- ruby legion.rb
17
- ```
18
-
19
- 基本的にMastodonインスタンスはLetsencryptを使用しているので、SSL証明書を使用する端末に導入しておく必要があります。
20
- その点だけご注意ください
21
-
22
- ## 参考
23
-
24
- [Ruby/Tk Beginner's tutorial ](https://www.dumbo.ai.kyutech.ac.jp/nomura-ken/kajiyama/ruby_tk/contents.html)
25
-
26
- [mastodon-api](https://github.com/tootsuite/mastodon-api)
1
+ # Legion
2
+ ## 概要
3
+ Ruby/Tk を使用して制作されたMastodonクライアントアプリっぽいものです。
4
+
5
+ ## 使い方
6
+
7
+ 以下のコマンドでLegionをインストールします。
8
+
9
+ ```
10
+ gem install legion_mastodon_client
11
+ ```
12
+
13
+ そして、以下のファイルを作成します。
14
+
15
+ legion.rb
16
+ ``` ruby:legion.rb
17
+ require 'bundler/setup'
18
+ Bundler.require(:default)
19
+
20
+ require 'legion'
21
+
22
+ Legion.exec
23
+ ```
24
+
25
+ Gemfile
26
+ ``` ruby:Gemfile
27
+ source "https://rubygems.org"
28
+
29
+ gem 'legion_mastodon_client', '~> 0.1.0'
30
+ gem 'mastodon-api', git: 'https://github.com/tootsuite/mastodon-api.git', ref: '189deb8'
31
+ gem 'dotenv'
32
+ gem "highline"
33
+ gem 'nokogiri'
34
+ gem 'rmagick'
35
+ gem 'parallel'
36
+ ```
37
+
38
+ その後、bundle install でgemをインストール
39
+
40
+ ```
41
+ bundle install
42
+ ```
43
+
44
+ 後は、`.env` を作成し、必要な環境変数を記入していくだけです。
45
+
46
+ ``` :.env
47
+ MASTODON_URL=<インスタンスのURL>
48
+ MASTODON_TOKEN=<インスタンスで発行したアクセストークン>
49
+ ```
50
+
51
+ 最後に以下のコマンドでLegionのUIを起動させるだけです。
52
+
53
+ ```
54
+ ruby legion.rb
55
+ ```
56
+
57
+ 基本的にMastodonインスタンスはLetsencryptを使用しているので、SSL証明書を使用する端末に導入しておく必要があります。
58
+ その点だけご注意ください
59
+
60
+ ## 参考
61
+
62
+ [Ruby/Tk Beginner's tutorial ](https://www.dumbo.ai.kyutech.ac.jp/nomura-ken/kajiyama/ruby_tk/contents.html)
63
+
64
+ [mastodon-api](https://github.com/tootsuite/mastodon-api)
data/bin/legion CHANGED
@@ -1,6 +1,6 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'legion'
4
- Dotenv.load
5
-
6
- puts legion.exec
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'legion'
4
+ Dotenv.load
5
+
6
+ puts legion.exec
data/lib/legion/legion.rb CHANGED
@@ -1,124 +1,69 @@
1
- require 'mastodon'
2
- require 'highline/import'
3
- require 'dotenv'
4
- require 'tk'
5
- require_relative 'mastodon'
6
-
7
- def LegionLoop
8
-
9
- window = TkToplevel.new do #タイトルバーの表示
10
- title( "Legion" )
11
- end
12
-
13
- Dotenv.load
14
-
15
- tootFrame = TkFrame.new(window)
16
- tootFrame.pack('side' => 'left', 'fill' => 'both')
17
-
18
- home_timeline = TkFrame.new(window)
19
- home_timeline.pack('side' => 'left', 'fill' => 'both')
20
-
21
- htl_label = TkLabel.new(home_timeline, 'text' => 'ホームタイムライン', 'width' => 50)
22
- htl_label.pack('side' => 'top', 'fill' => 'both')
23
-
24
- htl_list = TkListbox.new(home_timeline, 'height' => 25, 'selectmode' => 'multiple')
25
- htl_list.pack('fill' => 'both')
26
-
27
- home_timeline_yscrollbar = TkScrollbar.new(htl_list) {orient "vertical"; command proc{|*args| htl_list.yview(*args);} }
28
- htl_list['yscrollcommand'] = proc{|*args| home_timeline_yscrollbar.set(*args);}
29
- home_timeline_yscrollbar.pack('side' => 'right', 'fill' => 'both', 'ipadx' => '5', 'ipady' => '170')
30
-
31
- home_timeline_xscrollbar = TkScrollbar.new(htl_list) {orient "horizontal"; command proc{|*args| htl_list.xview(*args);} }
32
- htl_list['xscrollcommand'] = proc{|*args| home_timeline_xscrollbar.set(*args);}
33
- home_timeline_xscrollbar.pack('side' => 'bottom', 'fill' => 'both')
34
-
35
- local_timeline = TkFrame.new(window)
36
- local_timeline.pack('side' => 'left', 'fill' => 'both')
37
-
38
- ltl_label = TkLabel.new(local_timeline, 'text' => 'ローカルタイムライン', 'width' => 50)
39
- ltl_label.pack('side' => 'top', 'fill' => 'both')
40
-
41
- ltl_list = TkListbox.new(local_timeline, 'height' => 25, 'selectmode' => 'multiple')
42
- ltl_list.pack('fill' => 'both')
43
-
44
- local_timeline_yscrollbar = TkScrollbar.new(ltl_list) {orient "vertical"; command proc{|*args| ltl_list.yview(*args);} }
45
- ltl_list['yscrollcommand'] = proc{|*args| local_timeline_yscrollbar.set(*args);}
46
- local_timeline_yscrollbar.pack('side' => 'right', 'fill' => 'both', 'ipadx' => '5', 'ipady' => '170')
47
-
48
- local_timeline_xscrollbar = TkScrollbar.new(ltl_list) {orient "horizontal"; command proc{|*args| ltl_list.xview(*args);} }
49
- ltl_list['xscrollcommand'] = proc{|*args| local_timeline_xscrollbar.set(*args);}
50
- local_timeline_xscrollbar.pack('side' => 'bottom', 'fill' => 'both')
51
-
52
- public_timeline = TkFrame.new(window)
53
- public_timeline.pack('side' => 'left', 'fill' => 'both')
54
-
55
- ftl_label = TkLabel.new(public_timeline, 'text' => '連合タイムライン', 'width' => 50)
56
- ftl_label.pack('side' => 'top', 'fill' => 'both')
57
-
58
- ftl_list = TkListbox.new(public_timeline, 'height' => 25, 'selectmode' => 'multiple')
59
- ftl_list.pack('fill' => 'both')
60
-
61
- public_timeline_yscrollbar = TkScrollbar.new(ftl_list) {orient "vertical"; command proc{|*args| ftl_list.yview(*args);} }
62
- ftl_list['yscrollcommand'] = proc{|*args| public_timeline_yscrollbar.set(*args);}
63
- public_timeline_yscrollbar.pack('side' => 'right', 'fill' => 'both', 'ipadx' => '5', 'ipady' => '170')
64
-
65
- public_timeline_xscrollbar = TkScrollbar.new(ftl_list) {orient "horizontal"; command proc{|*args| ftl_list.xview(*args);} }
66
- ftl_list['xscrollcommand'] = proc{|*args| public_timeline_xscrollbar.set(*args);}
67
- public_timeline_xscrollbar.pack('side' => 'bottom', 'fill' => 'both')
68
-
69
- client = Mastodon::REST::Client.new(base_url: ENV["MASTODON_URL"], bearer_token: ENV["MASTODON_TOKEN"])
70
- mastodon = MastodonAPI.new(client)
71
-
72
- stream = Mastodon::Streaming::Client.new(base_url: ENV["MASTODON_URL"], bearer_token: ENV["MASTODON_TOKEN"])
73
- streaming = MastodonStreaming.new(stream)
74
-
75
- visibility = TkVariable.new('public')
76
- sensitive = TkVariable.new('false')
77
- spoiler_text = TkVariable.new("")
78
-
79
- text = TkText.new(tootFrame, 'width' => '50', 'height'=> '30')
80
- text.pack('side' => 'top', 'fill' => 'both')
81
-
82
- button = TkButton.new(tootFrame, 'text' => 'toot',
83
- 'command' => proc{mastodon.Toot(text.value, visibility.value, sensitive.value, spoiler_text.value);text.value=""})
84
- button.pack('side' => 'left', 'fill' => 'both')
85
-
86
- mediabutton = TkButton.new(tootFrame, 'text' => 'media',
87
- 'command' => proc{mastodon.MediaUpload(Tk.getOpenFile)})
88
- mediabutton.pack('side' => 'left', 'fill' => 'both')
89
-
90
- public_button = TkButton.new(tootFrame, 'text' => 'public',
91
- 'command' => proc{visibility.value = 'public' })
92
- public_button.pack('side' => 'left', 'fill' => 'both')
93
-
94
- unlisted_button = TkButton.new(tootFrame, 'text' => 'unlisted',
95
- 'command' => proc{visibility.value = 'unlisted' })
96
- unlisted_button.pack('side' => 'left', 'fill' => 'both')
97
-
98
- private_button = TkButton.new(tootFrame, 'text' => 'private',
99
- 'command' => proc{visibility.value = 'private' })
100
- private_button.pack('side' => 'left', 'fill' => 'both')
101
-
102
- direct_button = TkButton.new(tootFrame, 'text' => 'direct',
103
- 'command' => proc{visibility.value = 'direct' })
104
- direct_button.pack('side' => 'left', 'fill' => 'both')
105
-
106
- nsfw_button = TkButton.new(tootFrame, 'text' => 'nsfw',
107
- 'command' => proc{sensitive.value == 'true' ? sensitive.value = 'false' : sensitive.value = 'true' })
108
- nsfw_button.pack('side' => 'left', 'fill' => 'both')
109
-
110
- cw_button = TkButton.new(tootFrame, 'text' => 'cw',
111
- 'command' => proc{spoiler_text.value == "" ? spoiler_text.value = "Contents Warning!" : spoiler_text.value = "";
112
- sensitive.value == 'true' ? sensitive.value = 'false' : sensitive.value = 'true' })
113
- cw_button.pack('side' => 'left', 'fill' => 'both')
114
-
115
- quitbutton = TkButton.new(tootFrame, 'text' => 'quit',
116
- 'command' => proc{exit})
117
- quitbutton.pack('side' => 'right', 'fill' => 'both')
118
-
119
- loop do
120
- Parallel.each([[1, home_timeline, htl_list], [2, local_timeline, ltl_list], [3, public_timeline, ftl_list]], in_threads: 3) do |call|
121
- streaming.Timeline(call)
122
- end
123
- end
1
+ require 'mastodon'
2
+ require 'highline/import'
3
+ require 'dotenv'
4
+ require 'tk'
5
+ require_relative 'mastodon'
6
+ require_relative 'ui'
7
+
8
+ def LegionLoop
9
+
10
+ window = TkRoot.new do #タイトルバーの表示
11
+ title( "Legion" )
12
+ end
13
+
14
+ Dotenv.load
15
+
16
+ client = Mastodon::REST::Client.new(base_url: ENV["MASTODON_URL"], bearer_token: ENV["MASTODON_TOKEN"])
17
+ mastodon = MastodonAPI.new(client)
18
+
19
+ stream = Mastodon::Streaming::Client.new(base_url: ENV["MASTODON_URL"], bearer_token: ENV["MASTODON_TOKEN"])
20
+ streaming = MastodonStreaming.new(stream)
21
+
22
+ tootFrame = TootFrame.new(window, mastodon)
23
+ tootFrame.set
24
+
25
+ home_timeline = Timeline.new(window, "ホームタイムライン")
26
+ home_timeline.set
27
+
28
+ home_timeline_yscrollbar = TkScrollbar.new(home_timeline.list) {orient "vertical"; command proc{|*args| home_timeline.list.yview(*args);} }
29
+ home_timeline.list['yscrollcommand'] = proc{|*args| home_timeline_yscrollbar.set(*args);}
30
+ home_timeline_yscrollbar.pack('side' => 'right', 'fill' => 'both', 'ipadx' => '5', 'ipady' => '170')
31
+
32
+ home_timeline_xscrollbar = TkScrollbar.new(home_timeline.list) {orient "horizontal"; command proc{|*args| home_timeline.list.xview(*args);} }
33
+ home_timeline.list['xscrollcommand'] = proc{|*args| home_timeline_xscrollbar.set(*args);}
34
+ home_timeline_xscrollbar.pack('side' => 'bottom', 'fill' => 'both')
35
+
36
+ local_timeline = Timeline.new(window, "ローカルタイムライン")
37
+ local_timeline.set
38
+
39
+ local_timeline_yscrollbar = TkScrollbar.new(local_timeline.list) {orient "vertical"; command proc{|*args| local_timeline.list.yview(*args);} }
40
+ local_timeline.list['yscrollcommand'] = proc{|*args| local_timeline_yscrollbar.set(*args);}
41
+ local_timeline_yscrollbar.pack('side' => 'right', 'fill' => 'both', 'ipadx' => '5', 'ipady' => '170')
42
+
43
+ local_timeline_xscrollbar = TkScrollbar.new(local_timeline.list) {orient "horizontal"; command proc{|*args| local_timeline.list.xview(*args);} }
44
+ local_timeline.list['xscrollcommand'] = proc{|*args| local_timeline_xscrollbar.set(*args);}
45
+ local_timeline_xscrollbar.pack('side' => 'bottom', 'fill' => 'both')
46
+
47
+ public_timeline = Timeline.new(window, "連合タイムライン")
48
+ public_timeline.set
49
+
50
+ public_timeline_yscrollbar = TkScrollbar.new(public_timeline.list) {orient "vertical"; command proc{|*args| public_timeline.list.yview(*args);} }
51
+ public_timeline.list['yscrollcommand'] = proc{|*args| public_timeline_yscrollbar.set(*args);}
52
+ public_timeline_yscrollbar.pack('side' => 'right', 'fill' => 'both', 'ipadx' => '5', 'ipady' => '170')
53
+
54
+ public_timeline_xscrollbar = TkScrollbar.new(public_timeline.list) {orient "horizontal"; command proc{|*args| public_timeline.list.xview(*args);} }
55
+ public_timeline.list['xscrollcommand'] = proc{|*args| public_timeline_xscrollbar.set(*args);}
56
+ public_timeline_xscrollbar.pack('side' => 'bottom', 'fill' => 'both')
57
+
58
+
59
+ t1 = Thread.start {
60
+ loop do
61
+ Parallel.each([[1, home_timeline, home_timeline.list], [2, local_timeline, local_timeline.list], [3, public_timeline, public_timeline.list]], in_threads: 3) do |call|
62
+ streaming.Timeline(call)
63
+ end
64
+ end
65
+ }
66
+
67
+ Tk.mainloop
68
+
124
69
  end
@@ -1,72 +1,72 @@
1
- require 'nokogiri'
2
- require 'open-uri'
3
- require 'rmagick'
4
-
5
- class MastodonAPI
6
-
7
- def initialize(client)
8
- @client = client
9
- @timeline = Hash.new
10
- @avatar = Array.new
11
- @media_id = nil
12
- end
13
-
14
- def MediaUpload(file_path)
15
-
16
- if file_path != nil then
17
- @media_id = @client.upload_media(file_path).id
18
- else
19
- @media_id = nil
20
- end
21
- end
22
-
23
- def Toot(message, visibility, sensitive, spoiler_text)
24
- message += "\n #Legion"
25
- response = @client.create_status(message.encode("UTF-8"), :media_ids => @media_id, :visibility => visibility, :sensitive => sensitive, :spoiler_text => spoiler_text)
26
- end
27
- end
28
-
29
- class MastodonStreaming
30
-
31
- def initialize(stream)
32
- @stream = stream
33
- end
34
-
35
- def HomeTimeline(window, list)
36
- @stream.user() do |toot|
37
- message = Nokogiri::HTML.parse(toot.content, nil, nil).search('p')
38
- list.insert('0', message.text)
39
- end
40
- end
41
-
42
- def PublicTimeline(window, list)
43
- @stream.firehose() do |toot|
44
- message = Nokogiri::HTML.parse(toot.content, nil, nil).search('p')
45
- list.insert('0', message.text)
46
- end
47
- end
48
-
49
- def LocalTimeline(window, list)
50
- @stream.firehose() do |toot|
51
- if toot.uri.to_s =~ /#{ENV['MASTODON_URL'].to_s}/ then
52
- message = Nokogiri::HTML.parse(toot.content, nil, nil).search('p')
53
- list.insert('0', message.text)
54
- end
55
- end
56
- end
57
-
58
- def Timeline(timeline)
59
-
60
- case timeline[0]
61
-
62
- when 1
63
- self.HomeTimeline(timeline[1], timeline[2])
64
-
65
- when 2
66
- self.LocalTimeline(timeline[1], timeline[2])
67
-
68
- when 3
69
- self.PublicTimeline(timeline[1], timeline[2])
70
- end
71
- end
1
+ require 'nokogiri'
2
+ require 'open-uri'
3
+ require 'rmagick'
4
+
5
+ class MastodonAPI
6
+
7
+ def initialize(client)
8
+ @client = client
9
+ @timeline = Hash.new
10
+ @avatar = Array.new
11
+ @media_id = nil
12
+ end
13
+
14
+ def MediaUpload(file_path)
15
+
16
+ if file_path != nil then
17
+ @media_id = @client.upload_media(file_path).id
18
+ else
19
+ @media_id = nil
20
+ end
21
+ end
22
+
23
+ def Toot(message, visibility, sensitive, spoiler_text)
24
+ message += "\n #Legion"
25
+ response = @client.create_status(message.encode("UTF-8"), :media_ids => @media_id, :visibility => visibility, :sensitive => sensitive, :spoiler_text => spoiler_text)
26
+ end
27
+ end
28
+
29
+ class MastodonStreaming
30
+
31
+ def initialize(stream)
32
+ @stream = stream
33
+ end
34
+
35
+ def HomeTimeline(window, list)
36
+ @stream.user() do |toot|
37
+ message = Nokogiri::HTML.parse(toot.content, nil, nil).search('p')
38
+ list.insert('0', message.text)
39
+ end
40
+ end
41
+
42
+ def PublicTimeline(window, list)
43
+ @stream.firehose() do |toot|
44
+ message = Nokogiri::HTML.parse(toot.content, nil, nil).search('p')
45
+ list.insert('0', message.text)
46
+ end
47
+ end
48
+
49
+ def LocalTimeline(window, list)
50
+ @stream.firehose() do |toot|
51
+ if toot.uri.to_s =~ /#{ENV['MASTODON_URL'].to_s}/ then
52
+ message = Nokogiri::HTML.parse(toot.content, nil, nil).search('p')
53
+ list.insert('0', message.text)
54
+ end
55
+ end
56
+ end
57
+
58
+ def Timeline(timeline)
59
+
60
+ case timeline[0]
61
+
62
+ when 1
63
+ self.HomeTimeline(timeline[1], timeline[2])
64
+
65
+ when 2
66
+ self.LocalTimeline(timeline[1], timeline[2])
67
+
68
+ when 3
69
+ self.PublicTimeline(timeline[1], timeline[2])
70
+ end
71
+ end
72
72
  end
data/lib/legion/ui.rb ADDED
@@ -0,0 +1,106 @@
1
+
2
+ class Timeline
3
+ attr_accessor :list
4
+
5
+ def initialize(window, timeline_name)
6
+ @timeline = TkFrame.new(window)
7
+ @label = TkLabel.new(@timeline, 'text' => timeline_name, 'width' => 50)
8
+ @list = TkListbox.new(@timeline, 'height' => 25, 'selectmode' => 'multiple')
9
+ end
10
+
11
+ def timeline_pack
12
+ @timeline.pack('side' => 'left', 'fill' => 'both')
13
+ end
14
+
15
+ def label_pack
16
+ @label.pack('side' => 'top', 'fill' => 'both')
17
+ end
18
+
19
+ def list_pack
20
+ @list.pack('fill' => 'both')
21
+ end
22
+
23
+ def set
24
+ self.timeline_pack
25
+ self.label_pack
26
+ self.list_pack
27
+ end
28
+ end
29
+
30
+ class TootFrame
31
+
32
+ def initialize(window, mastodon)
33
+ @tootFrame = TkFrame.new(window)
34
+ @visibility = TkVariable.new('public')
35
+ @sensitive = TkVariable.new('false')
36
+ @spoiler_text = TkVariable.new("")
37
+ @text = text = TkText.new(@tootFrame, 'width' => '50', 'height'=> '30')
38
+ @button = TkButton.new(@tootFrame, 'text' => 'toot', 'command' => proc{mastodon.Toot(@text.value, @visibility.value, @sensitive.value, @spoiler_text.value);@text.value=""})
39
+ @mediabutton = TkButton.new(@tootFrame, 'text' => 'media', 'command' => proc{mastodon.MediaUpload(Tk.getOpenFile)})
40
+ @public_button = TkButton.new(@tootFrame, 'text' => 'public', 'command' => proc{@visibility.value = 'public' })
41
+ @unlisted_button = TkButton.new(@tootFrame, 'text' => 'unlisted', 'command' => proc{@visibility.value = 'unlisted' })
42
+ @private_button = TkButton.new(@tootFrame, 'text' => 'private', 'command' => proc{@visibility.value = 'private' })
43
+ @direct_button = TkButton.new(@tootFrame, 'text' => 'direct', 'command' => proc{@visibility.value = 'direct' })
44
+ @nsfw_button = TkButton.new(@tootFrame, 'text' => 'nsfw', 'command' => proc{@sensitive.value == 'true' ? @sensitive.value = 'false' : @sensitive.value = 'true' })
45
+ @cw_button = TkButton.new(@tootFrame, 'text' => 'cw', 'command' => proc{@spoiler_text.value == "" ? @spoiler_text.value = "Contents Warning!" : @spoiler_text.value = ""; @sensitive.value == 'true' ? @sensitive.value = 'false' : @sensitive.value = 'true' })
46
+ @quitbutton = TkButton.new(@tootFrame, 'text' => 'quit', 'command' => proc{exit})
47
+ end
48
+
49
+ def TootFrame_pack
50
+ @tootFrame.pack('side' => 'left', 'fill' => 'both')
51
+ end
52
+
53
+ def Text_pack
54
+ @text.pack('side' => 'top', 'fill' => 'both')
55
+ end
56
+
57
+ def Button_pack
58
+ @button.pack('side' => 'left', 'fill' => 'both')
59
+ end
60
+
61
+ def MediaButton_pack
62
+ @mediabutton.pack('side' => 'left', 'fill' => 'both')
63
+ end
64
+
65
+ def PubilcButton_pack
66
+ @public_button.pack('side' => 'left', 'fill' => 'both')
67
+ end
68
+
69
+ def UnlistedButton_pack
70
+ @unlisted_button.pack('side' => 'left', 'fill' => 'both')
71
+ end
72
+
73
+ def PrivateButton_pack
74
+ @private_button.pack('side' => 'left', 'fill' => 'both')
75
+ end
76
+
77
+ def DirectButton_pack
78
+ @direct_button.pack('side' => 'left', 'fill' => 'both')
79
+ end
80
+
81
+ def NsfwButton_pack
82
+ @nsfw_button.pack('side' => 'left', 'fill' => 'both')
83
+ end
84
+
85
+ def CwButton_pack
86
+ @cw_button.pack('side' => 'left', 'fill' => 'both')
87
+ end
88
+
89
+ def Quitbutton_pack
90
+ @quitbutton.pack('side' => 'right', 'fill' => 'both')
91
+ end
92
+
93
+ def set
94
+ self.TootFrame_pack
95
+ self.Text_pack
96
+ self.Button_pack
97
+ self.PubilcButton_pack
98
+ self.MediaButton_pack
99
+ self.UnlistedButton_pack
100
+ self.PrivateButton_pack
101
+ self.DirectButton_pack
102
+ self.NsfwButton_pack
103
+ self.CwButton_pack
104
+ self.Quitbutton_pack
105
+ end
106
+ end
@@ -1,3 +1,3 @@
1
1
  module Legion
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legion_mastodon_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - S-H-GAMELINKS
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-06-23 00:00:00.000000000 Z
11
+ date: 2018-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -76,6 +76,7 @@ files:
76
76
  - lib/legion.rb
77
77
  - lib/legion/legion.rb
78
78
  - lib/legion/mastodon.rb
79
+ - lib/legion/ui.rb
79
80
  - lib/legion/version.rb
80
81
  homepage: https://github.com/S-H-GAMELINKS/Legion
81
82
  licenses:
@@ -97,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
98
  version: '0'
98
99
  requirements: []
99
100
  rubyforge_project:
100
- rubygems_version: 2.7.6
101
+ rubygems_version: 2.7.7
101
102
  signing_key:
102
103
  specification_version: 4
103
104
  summary: Mastodon Client(Ruby/Tk)