2 * Sone - Preferences.java - Copyright © 2013–2016 David Roden
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 package net.pterodactylus.sone.core;
20 import static com.google.common.base.Predicates.equalTo;
21 import static java.lang.Integer.MAX_VALUE;
22 import static net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired.ALWAYS;
23 import static net.pterodactylus.sone.utils.IntegerRangePredicate.range;
25 import net.pterodactylus.sone.core.event.InsertionDelayChangedEvent;
26 import net.pterodactylus.sone.fcp.FcpInterface;
27 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired;
28 import net.pterodactylus.sone.fcp.event.FcpInterfaceActivatedEvent;
29 import net.pterodactylus.sone.fcp.event.FcpInterfaceDeactivatedEvent;
30 import net.pterodactylus.sone.fcp.event.FullAccessRequiredChanged;
31 import net.pterodactylus.sone.utils.DefaultOption;
32 import net.pterodactylus.sone.utils.Option;
33 import net.pterodactylus.util.config.Configuration;
34 import net.pterodactylus.util.config.ConfigurationException;
36 import com.google.common.base.Predicates;
37 import com.google.common.eventbus.EventBus;
40 * Convenience interface for external classes that want to access the core’s
43 public class Preferences {
45 private final EventBus eventBus;
46 private final Option<Integer> insertionDelay =
47 new DefaultOption<Integer>(60, range(0, MAX_VALUE));
48 private final Option<Integer> postsPerPage =
49 new DefaultOption<Integer>(10, range(1, MAX_VALUE));
50 private final Option<Integer> imagesPerPage =
51 new DefaultOption<Integer>(9, range(1, MAX_VALUE));
52 private final Option<Integer> charactersPerPost =
53 new DefaultOption<Integer>(400, Predicates.<Integer>or(
54 range(50, MAX_VALUE), equalTo(-1)));
55 private final Option<Integer> postCutOffLength =
56 new DefaultOption<Integer>(200, range(50, MAX_VALUE));
57 private final Option<Boolean> requireFullAccess =
58 new DefaultOption<Boolean>(false);
59 private final Option<Integer> positiveTrust =
60 new DefaultOption<Integer>(75, range(0, 100));
61 private final Option<Integer> negativeTrust =
62 new DefaultOption<Integer>(-25, range(-100, 100));
63 private final Option<String> trustComment =
64 new DefaultOption<String>("Set from Sone Web Interface");
65 private final Option<Boolean> activateFcpInterface =
66 new DefaultOption<Boolean>(false);
67 private final Option<FullAccessRequired> fcpFullAccessRequired =
68 new DefaultOption<FullAccessRequired>(ALWAYS);
70 public Preferences(EventBus eventBus) {
71 this.eventBus = eventBus;
75 * Returns the insertion delay.
77 * @return The insertion delay
79 public int getInsertionDelay() {
80 return insertionDelay.get();
84 * Validates the given insertion delay.
86 * @param insertionDelay
87 * The insertion delay to validate
88 * @return {@code true} if the given insertion delay was valid,
89 * {@code false} otherwise
91 public boolean validateInsertionDelay(Integer insertionDelay) {
92 return this.insertionDelay.validate(insertionDelay);
96 * Sets the insertion delay
98 * @param insertionDelay
99 * The new insertion delay, or {@code null} to restore it to
101 * @return This preferences
103 public Preferences setInsertionDelay(Integer insertionDelay) {
104 this.insertionDelay.set(insertionDelay);
105 eventBus.post(new InsertionDelayChangedEvent(getInsertionDelay()));
110 * Returns the number of posts to show per page.
112 * @return The number of posts to show per page
114 public int getPostsPerPage() {
115 return postsPerPage.get();
119 * Validates the number of posts per page.
121 * @param postsPerPage
122 * The number of posts per page
123 * @return {@code true} if the number of posts per page was valid,
124 * {@code false} otherwise
126 public boolean validatePostsPerPage(Integer postsPerPage) {
127 return this.postsPerPage.validate(postsPerPage);
131 * Sets the number of posts to show per page.
133 * @param postsPerPage
134 * The number of posts to show per page
135 * @return This preferences object
137 public Preferences setPostsPerPage(Integer postsPerPage) {
138 this.postsPerPage.set(postsPerPage);
143 * Returns the number of images to show per page.
145 * @return The number of images to show per page
147 public int getImagesPerPage() {
148 return imagesPerPage.get();
152 * Validates the number of images per page.
154 * @param imagesPerPage
155 * The number of images per page
156 * @return {@code true} if the number of images per page was valid,
157 * {@code false} otherwise
159 public boolean validateImagesPerPage(Integer imagesPerPage) {
160 return this.imagesPerPage.validate(imagesPerPage);
164 * Sets the number of images per page.
166 * @param imagesPerPage
167 * The number of images per page
168 * @return This preferences object
170 public Preferences setImagesPerPage(Integer imagesPerPage) {
171 this.imagesPerPage.set(imagesPerPage);
176 * Returns the number of characters per post, or <code>-1</code> if the
177 * posts should not be cut off.
179 * @return The numbers of characters per post
181 public int getCharactersPerPost() {
182 return charactersPerPost.get();
186 * Validates the number of characters per post.
188 * @param charactersPerPost
189 * The number of characters per post
190 * @return {@code true} if the number of characters per post was valid,
191 * {@code false} otherwise
193 public boolean validateCharactersPerPost(Integer charactersPerPost) {
194 return this.charactersPerPost.validate(charactersPerPost);
198 * Sets the number of characters per post.
200 * @param charactersPerPost
201 * The number of characters per post, or <code>-1</code> to
202 * not cut off the posts
203 * @return This preferences objects
205 public Preferences setCharactersPerPost(Integer charactersPerPost) {
206 this.charactersPerPost.set(charactersPerPost);
211 * Returns the number of characters the shortened post should have.
213 * @return The number of characters of the snippet
215 public int getPostCutOffLength() {
216 return postCutOffLength.get();
220 * Validates the number of characters after which to cut off the post.
222 * @param postCutOffLength
223 * The number of characters of the snippet
224 * @return {@code true} if the number of characters of the snippet is
225 * valid, {@code false} otherwise
227 public boolean validatePostCutOffLength(Integer postCutOffLength) {
228 return this.postCutOffLength.validate(postCutOffLength);
232 * Sets the number of characters the shortened post should have.
234 * @param postCutOffLength
235 * The number of characters of the snippet
236 * @return This preferences
238 public Preferences setPostCutOffLength(Integer postCutOffLength) {
239 this.postCutOffLength.set(postCutOffLength);
244 * Returns whether Sone requires full access to be even visible.
246 * @return {@code true} if Sone requires full access, {@code false}
249 public boolean isRequireFullAccess() {
250 return requireFullAccess.get();
254 * Sets whether Sone requires full access to be even visible.
256 * @param requireFullAccess
257 * {@code true} if Sone requires full access, {@code false}
260 public void setRequireFullAccess(Boolean requireFullAccess) {
261 this.requireFullAccess.set(requireFullAccess);
265 * Returns the positive trust.
267 * @return The positive trust
269 public int getPositiveTrust() {
270 return positiveTrust.get();
274 * Validates the positive trust.
276 * @param positiveTrust
277 * The positive trust to validate
278 * @return {@code true} if the positive trust was valid, {@code false}
281 public boolean validatePositiveTrust(Integer positiveTrust) {
282 return this.positiveTrust.validate(positiveTrust);
286 * Sets the positive trust.
288 * @param positiveTrust
289 * The new positive trust, or {@code null} to restore it to
291 * @return This preferences
293 public Preferences setPositiveTrust(Integer positiveTrust) {
294 this.positiveTrust.set(positiveTrust);
299 * Returns the negative trust.
301 * @return The negative trust
303 public int getNegativeTrust() {
304 return negativeTrust.get();
308 * Validates the negative trust.
310 * @param negativeTrust
311 * The negative trust to validate
312 * @return {@code true} if the negative trust was valid, {@code false}
315 public boolean validateNegativeTrust(Integer negativeTrust) {
316 return this.negativeTrust.validate(negativeTrust);
320 * Sets the negative trust.
322 * @param negativeTrust
323 * The negative trust, or {@code null} to restore it to the
325 * @return The preferences
327 public Preferences setNegativeTrust(Integer negativeTrust) {
328 this.negativeTrust.set(negativeTrust);
333 * Returns the trust comment. This is the comment that is set in the web
334 * of trust when a trust value is assigned to an identity.
336 * @return The trust comment
338 public String getTrustComment() {
339 return trustComment.get();
343 * Sets the trust comment.
345 * @param trustComment
346 * The trust comment, or {@code null} to restore it to the
348 * @return This preferences
350 public Preferences setTrustComment(String trustComment) {
351 this.trustComment.set(trustComment);
356 * Returns whether the {@link FcpInterface FCP interface} is currently
359 * @see FcpInterface#setActive(boolean)
360 * @return {@code true} if the FCP interface is currently active,
361 * {@code false} otherwise
363 public boolean isFcpInterfaceActive() {
364 return activateFcpInterface.get();
368 * Sets whether the {@link FcpInterface FCP interface} is currently
371 * @see FcpInterface#setActive(boolean)
372 * @param fcpInterfaceActive
373 * {@code true} to activate the FCP interface, {@code false}
374 * to deactivate the FCP interface
375 * @return This preferences object
377 public Preferences setFcpInterfaceActive(Boolean fcpInterfaceActive) {
378 this.activateFcpInterface.set(fcpInterfaceActive);
379 if (isFcpInterfaceActive()) {
380 eventBus.post(new FcpInterfaceActivatedEvent());
382 eventBus.post(new FcpInterfaceDeactivatedEvent());
388 * Returns the action level for which full access to the FCP interface
391 * @return The action level for which full access to the FCP interface
394 public FullAccessRequired getFcpFullAccessRequired() {
395 return fcpFullAccessRequired.get();
399 * Sets the action level for which full access to the FCP interface is
402 * @param fcpFullAccessRequired
404 * @return This preferences
406 public Preferences setFcpFullAccessRequired(
407 FullAccessRequired fcpFullAccessRequired) {
408 this.fcpFullAccessRequired.set(fcpFullAccessRequired);
409 eventBus.post(new FullAccessRequiredChanged(getFcpFullAccessRequired()));
413 public void saveTo(Configuration configuration) throws ConfigurationException {
414 configuration.getIntValue("Option/ConfigurationVersion").setValue(0);
415 configuration.getIntValue("Option/InsertionDelay").setValue(insertionDelay.getReal());
416 configuration.getIntValue("Option/PostsPerPage").setValue(postsPerPage.getReal());
417 configuration.getIntValue("Option/ImagesPerPage").setValue(imagesPerPage.getReal());
418 configuration.getIntValue("Option/CharactersPerPost").setValue(charactersPerPost.getReal());
419 configuration.getIntValue("Option/PostCutOffLength").setValue(postCutOffLength.getReal());
420 configuration.getBooleanValue("Option/RequireFullAccess").setValue(requireFullAccess.getReal());
421 configuration.getIntValue("Option/PositiveTrust").setValue(positiveTrust.getReal());
422 configuration.getIntValue("Option/NegativeTrust").setValue(negativeTrust.getReal());
423 configuration.getStringValue("Option/TrustComment").setValue(trustComment.getReal());
424 configuration.getBooleanValue("Option/ActivateFcpInterface").setValue(activateFcpInterface.getReal());
425 configuration.getIntValue("Option/FcpFullAccessRequired").setValue(toInt(fcpFullAccessRequired.getReal()));
428 private Integer toInt(FullAccessRequired fullAccessRequired) {
429 return (fullAccessRequired == null) ? null : fullAccessRequired.ordinal();