• sudopacman
    link
    fedilink
    arrow-up
    0
    ·
    4 years ago

    Регистрировать новый аккаунт на GitHub не охота, поэтому отправлю патч тут.

    https://github.com/cocucka-dev/lorsource/blob/master/src/main/java/ru/org/linux/user/User.java:

    @@ -30,6 +30,9 @@
     import java.sql.SQLException;
     import java.sql.Timestamp;
    
    +import java.util.ArrayDeque;
    +import java.util.Deque;
    +
     public class User implements Serializable {
       private static final int ANONYMOUS_LEVEL_SCORE = 50;
       public static final int ANONYMOUS_ID = 2;
    @@ -278,37 +281,41 @@
         return getStars(score, maxScore, true);
       }
    
    -  private static int getGreenStars(int score) {
    -    if (score < 0) {
    -      score = 0;
    +  private static int getStarCount(int score) {
    +    int stars = 0;
    +    int n;
    +
    +    Deque<Integer> d = new ArrayDeque<Integer>();
    +    d.add(1);
    +    d.add(1);
    +    d.add(1);
    +
    +    for(;;) {
    +      if (stars < d.size()) {
    +        n = (int) d.toArray()[stars];
    +      } else {
    +        n = d.pollLast() + d.peekLast();
    +        d.addFirst(n);
    +      }
    +      score = score - n*100;
    +      if (score < 0) {
    +        break;
    +      }
    +      stars = stars + 1;
         }
    -/*    if (score >= 600) {
    -      score = 599;
    -    }*/
    -
    -    return (int) Math.floor(score / 100.0);
    -  }
    -
    -  private static int getGreyStars(int score, int maxScore) {
    -    if (maxScore < 0) {
    -      maxScore = 0;
    -    }
    -    if (maxScore < score) {
    -      maxScore = score;
    -    }
    -/*    if (maxScore >= 600) {
    -      maxScore = 599;
    -    }*/
    -
    -    int stars = getGreenStars(score);
    -    return (int) Math.floor(maxScore / 100.0) - stars;
    +    return stars;
       }
    
       public static String getStars(int score, int maxScore, boolean html) {
         StringBuilder out = new StringBuilder();
    
    -    int stars = getGreenStars(score);
    -    int greyStars = getGreyStars(score, maxScore);
    +    int stars = getStarCount(score);
    +    int greyStars;
    +    if (maxScore == score) {
    +      greyStars = 0;
    +    } else {
    +      greyStars = getStarCount(maxScore) - stars;
    +    }
    
         if (html) {
           out.append("<span class=\"stars\">");
    
    • sudopacman
      link
      fedilink
      arrow-up
      0
      ·
      4 years ago

      @cocucka, что скажешь? Предлагаю вернуть звёзды на изначальное место и изменить систему расчёта их количества на вышеописанную.

      Вот у @cetjs2 должно быть 22 звезды, а вы ему только 11 насыпали. Видимо, потому, что даже если звёзды передвинуть под ник, то всё равно 22 штуки многовато. А по моему алгоритму у него будет 8 звёзд. Заодно четырёхзвёздочники перестанут быть краснокнижными существами.

      • cocuckaOP
        link
        fedilink
        arrow-up
        0
        ·
        4 years ago

        По мне так чем проще – тем лучше. Линейный рост, имхо, меньше вопросов вызовет, но и более 5 звёзд у ника даёт ощущение разговора с Брежневым. Может лучше сделать звёзды разноцветными? Типа до 500 простые зелёные, за 5 зелёных давать одну серебрянную, за 5 серебрянных – золотую. Не каждая птица долетит до пяти золотых.

        • l-xoid
          link
          fedilink
          arrow-up
          0
          ·
          4 years ago

          Типа до 500 простые зелёные, за 5 зелёных давать одну серебрянную, за 5 серебрянных – золотую

          А за 5 золотых - библию в простом переплёте.

        • sudopacman
          link
          fedilink
          arrow-up
          0
          ·
          4 years ago

          По мне так чем проще – тем лучше. Линейный рост, имхо, меньше вопросов вызовет

          По-моему, начисление score уже достаточно нетривиально, чтобы вызывать вопросы у тех, кто пытается понять, как оно работает. Собственно, я вообще считаю, что пользователям достаточно просто знать, что чем больше звёзд, тем дольше будешь добираться до следующей — понимать механизм работы необязательно. В профиле рядом со score отображать количество, при котором появится следующая звезда. Т. е., например, 350 / 500. (При наведении на 500 показывать поясняющую надпись.) Любителям “игоря” такой принцип должен быть вполне знаком. Для любознательных где-нибудь на FAQ-странице привести вышеуказанную таблицу и описание алгоритма. Если что, я лично готов объяснять, как оно работает, всем, у кого возникнут вопросы.

          Может лучше сделать звёзды разноцветными?

          Мне такая идея не очень нравится, обилие цветов слишком перегружает информационный фон. Всё-таки цвета лучше использовать для выделения информации, а не как отдельную смысловую единицу. (Тут ещё стоит учитывать существование разных тем и пользовательских стилей.)

        • sudopacman
          link
          fedilink
          arrow-up
          0
          ·
          4 years ago

          Ещё неплохо бы время написания сообщения перенести в ту же строчку, что и user-agent (с тем же размером шрифта):

          sudopacman ★★★★★★ <тут может быть комментарий о пользователе>
          Последнее исправление: sudopacman 14.06.22 20:01:06 (всего исправлений: 2)
          Windows / Firefox / 14.06.22 19:51:48  
          [Ответить на это сообщение] [Показать ответ] [Ссылка]