1 |
6a3fcb6d
|
みぞ@CrazyBeatCoder
|
package com.mizo0203.timeline.talker;
|
2 |
|
|
|
3 |
|
|
import com.google.gson.Gson;
|
4 |
|
|
import com.sys1yagi.mastodon4j.MastodonClient;
|
5 |
|
|
import okhttp3.OkHttpClient;
|
6 |
|
|
import org.jetbrains.annotations.NotNull;
|
7 |
|
|
import org.jetbrains.annotations.Nullable;
|
8 |
|
|
import twitter4j.conf.Configuration;
|
9 |
|
|
import twitter4j.conf.ConfigurationBuilder;
|
10 |
|
|
|
11 |
|
|
/**
|
12 |
|
|
* Java アプリケーション起動時に指定する引数のデータクラス
|
13 |
|
|
*
|
14 |
|
|
* @author みぞ@CrazyBeatCoder
|
15 |
|
|
*/
|
16 |
|
|
/* package */ class Arguments {
|
17 |
|
|
|
18 |
|
|
@Nullable /* package */ final Configuration twitterConfiguration;
|
19 |
|
|
@Nullable /* package */ final MastodonClient mastodonClient;
|
20 |
|
|
|
21 |
|
|
/* package */ Arguments(String[] args) throws IllegalArgumentException {
|
22 |
|
|
if (args.length == Argument.values().length) {
|
23 |
|
|
twitterConfiguration =
|
24 |
|
|
createTwitterConfiguration(
|
25 |
|
|
args[Argument.TWITTER_CONSUMER_KEY.ordinal()],
|
26 |
|
|
args[Argument.TWITTER_CONSUMER_SECRET.ordinal()],
|
27 |
|
|
args[Argument.TWITTER_ACCESS_TOKEN.ordinal()],
|
28 |
|
|
args[Argument.TWITTER_ACCESS_TOKEN_SECRET.ordinal()]);
|
29 |
|
|
mastodonClient =
|
30 |
|
|
createMastodonClient(
|
31 |
|
|
args[Argument.MASTODON_INSTANCE_NAME.ordinal()],
|
32 |
|
|
args[Argument.MASTODON_ACCESS_TOKEN.ordinal()]);
|
33 |
|
|
} else if (args.length == Argument.Twitter.values().length) {
|
34 |
|
|
twitterConfiguration =
|
35 |
|
|
createTwitterConfiguration(
|
36 |
|
|
args[Argument.Twitter.CONSUMER_KEY.ordinal()],
|
37 |
|
|
args[Argument.Twitter.CONSUMER_SECRET.ordinal()],
|
38 |
|
|
args[Argument.Twitter.ACCESS_TOKEN.ordinal()],
|
39 |
|
|
args[Argument.Twitter.ACCESS_TOKEN_SECRET.ordinal()]);
|
40 |
|
|
mastodonClient = null;
|
41 |
|
|
} else if (args.length == Argument.Mastodon.values().length) {
|
42 |
|
|
twitterConfiguration = null;
|
43 |
|
|
mastodonClient =
|
44 |
|
|
createMastodonClient(
|
45 |
|
|
args[Argument.Mastodon.INSTANCE_NAME.ordinal()],
|
46 |
|
|
args[Argument.Mastodon.ACCESS_TOKEN.ordinal()]);
|
47 |
|
|
} else {
|
48 |
|
|
throw createIllegalArgumentException();
|
49 |
|
|
}
|
50 |
|
|
}
|
51 |
|
|
|
52 |
|
|
private static Configuration createTwitterConfiguration(
|
53 |
|
|
String twitterConsumerKey,
|
54 |
|
|
String twitterConsumerSecret,
|
55 |
|
|
String twitterAccessToken,
|
56 |
|
|
String twitterAccessTokenSecret) {
|
57 |
|
|
return new ConfigurationBuilder()
|
58 |
|
|
.setOAuthConsumerKey(twitterConsumerKey)
|
59 |
|
|
.setOAuthConsumerSecret(twitterConsumerSecret)
|
60 |
|
|
.setOAuthAccessToken(twitterAccessToken)
|
61 |
|
|
.setOAuthAccessTokenSecret(twitterAccessTokenSecret)
|
62 |
|
|
.build();
|
63 |
|
|
}
|
64 |
|
|
|
65 |
|
|
private static MastodonClient createMastodonClient(
|
66 |
|
|
String mastodonInstanceName, String mastodonAccessToken) {
|
67 |
|
|
return new MastodonClient.Builder(mastodonInstanceName, new OkHttpClient.Builder(), new Gson())
|
68 |
|
|
.accessToken(mastodonAccessToken)
|
69 |
|
|
.useStreamingApi()
|
70 |
|
|
.build();
|
71 |
|
|
}
|
72 |
|
|
|
73 |
|
|
private static IllegalArgumentException createIllegalArgumentException() {
|
74 |
|
|
return new IllegalArgumentException(
|
75 |
|
|
Argument.createExceptionMessage()
|
76 |
|
|
+ "\n"
|
77 |
|
|
+ Argument.Twitter.createExceptionMessage()
|
78 |
|
|
+ "\n"
|
79 |
|
|
+ Argument.Mastodon.createExceptionMessage());
|
80 |
|
|
}
|
81 |
|
|
|
82 |
|
|
/**
|
83 |
|
|
* Java アプリケーション起動時に指定する引数の定義
|
84 |
|
|
*
|
85 |
|
|
* @author みぞ@CrazyBeatCoder
|
86 |
|
|
*/
|
87 |
|
|
private enum Argument {
|
88 |
|
|
TWITTER_CONSUMER_KEY, //
|
89 |
|
|
TWITTER_CONSUMER_SECRET, //
|
90 |
|
|
TWITTER_ACCESS_TOKEN, //
|
91 |
|
|
TWITTER_ACCESS_TOKEN_SECRET, //
|
92 |
|
|
MASTODON_INSTANCE_NAME, //
|
93 |
|
|
MASTODON_ACCESS_TOKEN, //
|
94 |
|
|
;
|
95 |
|
|
|
96 |
|
|
@NotNull
|
97 |
|
|
private static String createExceptionMessage() {
|
98 |
|
|
StringBuilder exceptionMessage =
|
99 |
|
|
new StringBuilder("Twitter と Mastodon の両方を読み上げる場合、 ")
|
100 |
|
|
.append(values().length)
|
101 |
|
|
.append(" つの引数を指定してください。\n");
|
102 |
|
|
for (Argument arg : values()) {
|
103 |
|
|
exceptionMessage
|
104 |
|
|
.append(arg.ordinal() + 1)
|
105 |
|
|
.append(" つ目: ")
|
106 |
|
|
.append(arg.getDetail())
|
107 |
|
|
.append("\n");
|
108 |
|
|
}
|
109 |
|
|
|
110 |
|
|
return exceptionMessage.toString();
|
111 |
|
|
}
|
112 |
|
|
|
113 |
|
|
@NotNull
|
114 |
|
|
private String getDetail() throws IllegalStateException {
|
115 |
|
|
switch (this) {
|
116 |
|
|
case TWITTER_CONSUMER_KEY:
|
117 |
|
|
return "Twitter Application's Consumer Key (API Key)";
|
118 |
|
|
case TWITTER_CONSUMER_SECRET:
|
119 |
|
|
return "Twitter Application's Consumer Secret (API Secret)";
|
120 |
|
|
case TWITTER_ACCESS_TOKEN:
|
121 |
|
|
return "Twitter Account's Access Token";
|
122 |
|
|
case TWITTER_ACCESS_TOKEN_SECRET:
|
123 |
|
|
return "Twitter Account's Access Token Secret";
|
124 |
|
|
case MASTODON_INSTANCE_NAME:
|
125 |
|
|
return "Mastodon Instance Name";
|
126 |
|
|
case MASTODON_ACCESS_TOKEN:
|
127 |
|
|
return "Mastodon Account's Access Token";
|
128 |
|
|
default:
|
129 |
|
|
throw new IllegalStateException("getDetail this: " + this);
|
130 |
|
|
}
|
131 |
|
|
}
|
132 |
|
|
|
133 |
|
|
private enum Twitter {
|
134 |
|
|
CONSUMER_KEY, //
|
135 |
|
|
CONSUMER_SECRET, //
|
136 |
|
|
ACCESS_TOKEN, //
|
137 |
|
|
ACCESS_TOKEN_SECRET, //
|
138 |
|
|
;
|
139 |
|
|
|
140 |
|
|
@NotNull
|
141 |
|
|
private static String createExceptionMessage() {
|
142 |
|
|
StringBuilder exceptionMessage =
|
143 |
|
|
new StringBuilder("Twitter のみを読み上げる場合、 ")
|
144 |
|
|
.append(values().length)
|
145 |
|
|
.append(" つの引数を指定してください。\n");
|
146 |
|
|
for (Argument.Twitter arg : values()) {
|
147 |
|
|
exceptionMessage
|
148 |
|
|
.append(arg.ordinal() + 1)
|
149 |
|
|
.append(" つ目: ")
|
150 |
|
|
.append(arg.getDetail())
|
151 |
|
|
.append("\n");
|
152 |
|
|
}
|
153 |
|
|
return exceptionMessage.toString();
|
154 |
|
|
}
|
155 |
|
|
|
156 |
|
|
@NotNull
|
157 |
|
|
private String getDetail() throws IllegalStateException {
|
158 |
|
|
switch (this) {
|
159 |
|
|
case CONSUMER_KEY:
|
160 |
|
|
return TWITTER_CONSUMER_KEY.getDetail();
|
161 |
|
|
case CONSUMER_SECRET:
|
162 |
|
|
return TWITTER_CONSUMER_SECRET.getDetail();
|
163 |
|
|
case ACCESS_TOKEN:
|
164 |
|
|
return TWITTER_ACCESS_TOKEN.getDetail();
|
165 |
|
|
case ACCESS_TOKEN_SECRET:
|
166 |
|
|
return TWITTER_ACCESS_TOKEN_SECRET.getDetail();
|
167 |
|
|
default:
|
168 |
|
|
throw new IllegalStateException("getDetail this: " + this);
|
169 |
|
|
}
|
170 |
|
|
}
|
171 |
|
|
}
|
172 |
|
|
|
173 |
|
|
private enum Mastodon {
|
174 |
|
|
INSTANCE_NAME, //
|
175 |
|
|
ACCESS_TOKEN, //
|
176 |
|
|
;
|
177 |
|
|
|
178 |
|
|
@NotNull
|
179 |
|
|
private static String createExceptionMessage() {
|
180 |
|
|
StringBuilder exceptionMessage =
|
181 |
|
|
new StringBuilder("Mastodon のみを読み上げる場合、 ")
|
182 |
|
|
.append(values().length)
|
183 |
|
|
.append(" つの引数を指定してください。\n");
|
184 |
|
|
for (Argument.Mastodon arg : values()) {
|
185 |
|
|
exceptionMessage
|
186 |
|
|
.append(arg.ordinal() + 1)
|
187 |
|
|
.append(" つ目: ")
|
188 |
|
|
.append(arg.getDetail())
|
189 |
|
|
.append("\n");
|
190 |
|
|
}
|
191 |
|
|
return exceptionMessage.toString();
|
192 |
|
|
}
|
193 |
|
|
|
194 |
|
|
@NotNull
|
195 |
|
|
private String getDetail() throws IllegalStateException {
|
196 |
|
|
switch (this) {
|
197 |
|
|
case INSTANCE_NAME:
|
198 |
|
|
return MASTODON_INSTANCE_NAME.getDetail();
|
199 |
|
|
case ACCESS_TOKEN:
|
200 |
|
|
return MASTODON_ACCESS_TOKEN.getDetail();
|
201 |
|
|
default:
|
202 |
|
|
throw new IllegalStateException("getDetail this: " + this);
|
203 |
|
|
}
|
204 |
|
|
}
|
205 |
|
|
}
|
206 |
|
|
}
|
207 |
|
|
}
|