プロジェクト

全般

プロフィール

ダウンロード (6.96 KB) 統計
| ブランチ: | タグ: | リビジョン:

github / src / com / mizo0203 / timeline / talker / Arguments.java @ 6a3fcb6d

1
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
}
(1-1/6)