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

    хз. бери гитхаб, присылай патч.

    • 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  
            [Ответить на это сообщение] [Показать ответ] [Ссылка]