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<>(60, range(0, MAX_VALUE));
48 private final Option<Integer> postsPerPage =
49 new DefaultOption<>(10, range(1, MAX_VALUE));
50 private final Option<Integer> imagesPerPage =
51 new DefaultOption<>(9, range(1, MAX_VALUE));
52 private final Option<Integer> charactersPerPost =
53 new DefaultOption<>(400, Predicates.<Integer>or(
54 range(50, MAX_VALUE), equalTo(-1)));
55 private final Option<Integer> postCutOffLength =
56 new DefaultOption<>(200, range(50, MAX_VALUE));
57 private final Option<Boolean> requireFullAccess =
58 new DefaultOption<>(false);
59 private final Option<Integer> positiveTrust =
60 new DefaultOption<>(75, range(0, 100));
61 private final Option<Integer> negativeTrust =
62 new DefaultOption<>(-25, range(-100, 100));
63 private final Option<String> trustComment =
64 new DefaultOption<>("Set from Sone Web Interface");
65 private final Option<Boolean> activateFcpInterface =
66 new DefaultOption<>(false);
67 private final Option<FullAccessRequired> fcpFullAccessRequired =
68 new DefaultOption<>(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()));
106 eventBus.post(new PreferenceChangedEvent("InsertionDelay", getInsertionDelay()));
111 * Returns the number of posts to show per page.
113 * @return The number of posts to show per page
115 public int getPostsPerPage() {
116 return postsPerPage.get();
120 * Validates the number of posts per page.
122 * @param postsPerPage
123 * The number of posts per page
124 * @return {@code true} if the number of posts per page was valid,
125 * {@code false} otherwise
127 public boolean validatePostsPerPage(Integer postsPerPage) {
128 return this.postsPerPage.validate(postsPerPage);
132 * Sets the number of posts to show per page.
134 * @param postsPerPage
135 * The number of posts to show per page
136 * @return This preferences object
138 public Preferences setPostsPerPage(Integer postsPerPage) {
139 this.postsPerPage.set(postsPerPage);
140 eventBus.post(new PreferenceChangedEvent("PostsPerPage", getPostsPerPage()));
145 * Returns the number of images to show per page.
147 * @return The number of images to show per page
149 public int getImagesPerPage() {
150 return imagesPerPage.get();
154 * Validates the number of images per page.
156 * @param imagesPerPage
157 * The number of images per page
158 * @return {@code true} if the number of images per page was valid,
159 * {@code false} otherwise
161 public boolean validateImagesPerPage(Integer imagesPerPage) {
162 return this.imagesPerPage.validate(imagesPerPage);
166 * Sets the number of images per page.
168 * @param imagesPerPage
169 * The number of images per page
170 * @return This preferences object
172 public Preferences setImagesPerPage(Integer imagesPerPage) {
173 this.imagesPerPage.set(imagesPerPage);
178 * Returns the number of characters per post, or <code>-1</code> if the
179 * posts should not be cut off.
181 * @return The numbers of characters per post
183 public int getCharactersPerPost() {
184 return charactersPerPost.get();
188 * Validates the number of characters per post.
190 * @param charactersPerPost
191 * The number of characters per post
192 * @return {@code true} if the number of characters per post was valid,
193 * {@code false} otherwise
195 public boolean validateCharactersPerPost(Integer charactersPerPost) {
196 return this.charactersPerPost.validate(charactersPerPost);
200 * Sets the number of characters per post.
202 * @param charactersPerPost
203 * The number of characters per post, or <code>-1</code> to
204 * not cut off the posts
205 * @return This preferences objects
207 public Preferences setCharactersPerPost(Integer charactersPerPost) {
208 this.charactersPerPost.set(charactersPerPost);
213 * Returns the number of characters the shortened post should have.
215 * @return The number of characters of the snippet
217 public int getPostCutOffLength() {
218 return postCutOffLength.get();
222 * Validates the number of characters after which to cut off the post.
224 * @param postCutOffLength
225 * The number of characters of the snippet
226 * @return {@code true} if the number of characters of the snippet is
227 * valid, {@code false} otherwise
229 public boolean validatePostCutOffLength(Integer postCutOffLength) {
230 return this.postCutOffLength.validate(postCutOffLength);
234 * Sets the number of characters the shortened post should have.
236 * @param postCutOffLength
237 * The number of characters of the snippet
238 * @return This preferences
240 public Preferences setPostCutOffLength(Integer postCutOffLength) {
241 this.postCutOffLength.set(postCutOffLength);
246 * Returns whether Sone requires full access to be even visible.
248 * @return {@code true} if Sone requires full access, {@code false}
251 public boolean isRequireFullAccess() {
252 return requireFullAccess.get();
256 * Sets whether Sone requires full access to be even visible.
258 * @param requireFullAccess
259 * {@code true} if Sone requires full access, {@code false}
262 public void setRequireFullAccess(Boolean requireFullAccess) {
263 this.requireFullAccess.set(requireFullAccess);
267 * Returns the positive trust.
269 * @return The positive trust
271 public int getPositiveTrust() {
272 return positiveTrust.get();
276 * Validates the positive trust.
278 * @param positiveTrust
279 * The positive trust to validate
280 * @return {@code true} if the positive trust was valid, {@code false}
283 public boolean validatePositiveTrust(Integer positiveTrust) {
284 return this.positiveTrust.validate(positiveTrust);
288 * Sets the positive trust.
290 * @param positiveTrust
291 * The new positive trust, or {@code null} to restore it to
293 * @return This preferences
295 public Preferences setPositiveTrust(Integer positiveTrust) {
296 this.positiveTrust.set(positiveTrust);
301 * Returns the negative trust.
303 * @return The negative trust
305 public int getNegativeTrust() {
306 return negativeTrust.get();
310 * Validates the negative trust.
312 * @param negativeTrust
313 * The negative trust to validate
314 * @return {@code true} if the negative trust was valid, {@code false}
317 public boolean validateNegativeTrust(Integer negativeTrust) {
318 return this.negativeTrust.validate(negativeTrust);
322 * Sets the negative trust.
324 * @param negativeTrust
325 * The negative trust, or {@code null} to restore it to the
327 * @return The preferences
329 public Preferences setNegativeTrust(Integer negativeTrust) {
330 this.negativeTrust.set(negativeTrust);
335 * Returns the trust comment. This is the comment that is set in the web
336 * of trust when a trust value is assigned to an identity.
338 * @return The trust comment
340 public String getTrustComment() {
341 return trustComment.get();
345 * Sets the trust comment.
347 * @param trustComment
348 * The trust comment, or {@code null} to restore it to the
350 * @return This preferences
352 public Preferences setTrustComment(String trustComment) {
353 this.trustComment.set(trustComment);
358 * Returns whether the {@link FcpInterface FCP interface} is currently
361 * @see FcpInterface#setActive(boolean)
362 * @return {@code true} if the FCP interface is currently active,
363 * {@code false} otherwise
365 public boolean isFcpInterfaceActive() {
366 return activateFcpInterface.get();
370 * Sets whether the {@link FcpInterface FCP interface} is currently
373 * @see FcpInterface#setActive(boolean)
374 * @param fcpInterfaceActive
375 * {@code true} to activate the FCP interface, {@code false}
376 * to deactivate the FCP interface
377 * @return This preferences object
379 public Preferences setFcpInterfaceActive(Boolean fcpInterfaceActive) {
380 this.activateFcpInterface.set(fcpInterfaceActive);
381 if (isFcpInterfaceActive()) {
382 eventBus.post(new FcpInterfaceActivatedEvent());
384 eventBus.post(new FcpInterfaceDeactivatedEvent());
390 * Returns the action level for which full access to the FCP interface
393 * @return The action level for which full access to the FCP interface
396 public FullAccessRequired getFcpFullAccessRequired() {
397 return fcpFullAccessRequired.get();
401 * Sets the action level for which full access to the FCP interface is
404 * @param fcpFullAccessRequired
406 * @return This preferences
408 public Preferences setFcpFullAccessRequired(
409 FullAccessRequired fcpFullAccessRequired) {
410 this.fcpFullAccessRequired.set(fcpFullAccessRequired);
411 eventBus.post(new FullAccessRequiredChanged(getFcpFullAccessRequired()));
415 public void saveTo(Configuration configuration) throws ConfigurationException {
416 configuration.getIntValue("Option/ConfigurationVersion").setValue(0);
417 configuration.getIntValue("Option/InsertionDelay").setValue(insertionDelay.getReal());
418 configuration.getIntValue("Option/PostsPerPage").setValue(postsPerPage.getReal());
419 configuration.getIntValue("Option/ImagesPerPage").setValue(imagesPerPage.getReal());
420 configuration.getIntValue("Option/CharactersPerPost").setValue(charactersPerPost.getReal());
421 configuration.getIntValue("Option/PostCutOffLength").setValue(postCutOffLength.getReal());
422 configuration.getBooleanValue("Option/RequireFullAccess").setValue(requireFullAccess.getReal());
423 configuration.getIntValue("Option/PositiveTrust").setValue(positiveTrust.getReal());
424 configuration.getIntValue("Option/NegativeTrust").setValue(negativeTrust.getReal());
425 configuration.getStringValue("Option/TrustComment").setValue(trustComment.getReal());
426 configuration.getBooleanValue("Option/ActivateFcpInterface").setValue(activateFcpInterface.getReal());
427 configuration.getIntValue("Option/FcpFullAccessRequired").setValue(toInt(fcpFullAccessRequired.getReal()));
430 private Integer toInt(FullAccessRequired fullAccessRequired) {
431 return (fullAccessRequired == null) ? null : fullAccessRequired.ordinal();