@보팅주사위2는 뉴비를 위한 게 아니다.

in #kr7 years ago (edited)

안녕하세요!
@kanisuka 뉴비 스티미언 카니입니다.

@주사위 댓글 놀이...

많이들 재미있게 하시죠? 특히나 이벤트 등에 많이 사용되며, 저 또한 뉴비 풀보팅 이벤트에서 @주사위를 사용하고 있습니다.

그런데 @주사위 이벤트를 진행할 때, 힘든 점 중에 하나가 댓글 다시는 분들 하나하나 주사위 숫자를 확인하면서 조건에 맞는 (저 같은 경우에는 가장 큰 숫자 3분) 댓글 다신 분들을 찾는 게 여간 쉬운 일이 아닌 것 같습니다.

동시에, 보팅하신 분과 팔로잉하신 분들까지도 일일이 체크한다는 게...

아마 이벤트를 자주 해보신 분들이라면 이러한 저의 고충을 잘 아시라 생각됩니다.

그럼 좋은 방법이 있나요?


댓글에 @주사위를 다는 게 아니라, 사용자분들은 단지 그냥 댓글 & 보팅만 하고 난 뒤, 이벤트를 연 사람이 /opdice 나 @보팅주사위1, 2를 사용하면 알아서 정리해서 댓글로 달아줍니다.

참고로 사용법은 아래와 같습니다.

1.png

위 설명은 @보팅주사위를 만드시 @jungs 님 글에서 발췌한 내용입니다.

그럼 저거 쓰면 되지, 다른 걸 고민할 필요가 있나요?


문제가 있습니다.

@보팅주사위1, 보팅주사위2를 소개한 아래 내용을 한번 확인해보도록 하죠.

2.png

4.png

금액이 무조껀 0.01$ 이상이어야 합니다.

이렇게 되면, 대다수의 뉴비분들은 제 이벤트에 참여를 못하는 불상사가 벌어지게 됩니다.

아래 한번 보시죠. 100% 풀보팅을 했음에도 불구하고, 0.00$ 이신 뉴비분들이 상당수 계십니다.

저는 개인적으로 이벤트 참여에 제한을 두면 안 된다고 생각합니다. 특히나, 뉴비를 위한 이벤트일 경우에는 더욱 더 그러하겠죠.

그래서 @주사위 놀이로 이벤트를 진행하려고 합니다.

그럼 다른 방법이 있나요?


네, 있습니다. 이제부터가 이번 포스팅을 쓰기 위한 주 목적인 셈인거죠.

우리는 이벤트를 할 때, 재미 요소를 붙이고 있습니다. @주사위는 저희에게 재미 요소를 주기에 충분하죠.

그렇다고, 이벤트를 진행하는 사람이 이벤트 진행 때문에 너무 많은 시간을 소요하고, 노동이라고 느끼면 안 된다고 생각합니다.

그래서, 제가 진행하는 뉴비 풀보팅 이벤트를 손쉽게 진행하기 위해서 간단하고 프로그램을 만들었습니다.

프로그램 동작 방식은 아래와 같습니다.

  1. 주사위를 돌린 사용자 목록 및 주사위 숫자를 추출한다.
  2. 주사위 숫자가 큰 순서대로 사용자 목록을 정렬한다.
  3. 이벤트 글에 보팅한 사용자 목록을 추출한다.
  4. 현재 나에게 팔로잉하고 있는 사용자 목록을 추출한다.
  5. 주사위를 돌린 사용자 목록을 통해, 이벤트 글에 보팅했는 지, 팔로잉하였는 지 여부를 체크한다.
  6. 파일로 결과값을 적는다.

의외로 보시는 바와 같이 작동 원리는 간단합니다.

좀 더 자세하게 개발 레벨까지 설명해주세요.


제일 중요한 건, Steemit에 있는 정보를 어떻게 가져올 수 있으냐가 관건이겠죠.

자, 그럼 여기서 필요로 하는 정보들은 어떻게 추출하였을까요?

Steemit에서 쌓이고 있는 정보들을 손쉽게 접근해서 추출할 수 있는 steem-java-api-wrapper 라이브러리를 이용해서 구현하였습니다.

아래와 같이 java 프로젝트에 maven dependency를 적으시면, 자동으로 해당 라이브러리를 다운로드 받게 됩니다.

<dependency>
    <groupId>eu.bittrade.libs</groupId>
    <artifactId>steemj-core</artifactId>
    <version>0.4.3</version>
</dependency>


그리고, 자바 프로젝트를 하나 생성한 뒤, SteemJConfig 객체를 통해 아래와 같이 기본 설정 정보들을 입력합니다.

  • 응답 속도 시간
  • 내 계정
  • 개인키 목록 입력


자, 기본 설정이 되었으니, 실제 동작 함수들을 살펴볼까요?

너무 깊게 들어가면 머리가 복잡해질 수 있으니, 간단하게 설명을 드리도록 할께요.

아래 함수는 주사위를 돌린 사람들 목록을 가져오는 함수로써, 제가 쓴 글을 입력하면, 제가 포스팅한 글에 대한 댓글의 댓글(여기가 포인트임)을 읽어들여서, 주사위를 굴린 사용자와 주사위 값을 추출하게 됩니다.

public List<SteemUserBean> getDiceUsers(String link) {

    List<SteemUserBean> users = Lists.newArrayList();

    List<Discussion> replies = steemj.getContentReplies(
                SteemJConfig.getInstance().getDefaultAccount(), 
                new Permlink(link));
        
    for (Discussion reply : replies) {
            
        List<Discussion> subReplies = steemj.getContentReplies(
                    reply.getAuthor(), 
                    reply.getPermlink());
            
        for (Discussion subReply : subReplies) {
            String content = subReply.getBody();
            log.info("content:{}", content);

            if (content.contains(FIXED_KEYWORD)) {

                String id = StringUtils.substringBetween(content, "\n@", "님이 ");
                int rand = Integer.parseInt(
                    StringUtils.substringBetween(content, "굴려서 ", "이 나왔습니다."));

                SteemUserBean user = new SteemUserBean();
                user.setId(id);
                user.setRand(rand);

                users.add(user);

                log.info(user.toString());

            }
        }

    }
        
    // 사용자 정렬
    Collections.sort(users...);

    return users;
}


아래는 제가 포스팅한 이벤트 글에 보팅을 한 사용자들을 추출하는 함수입니다.

    public List<String> getActiveVoteUsers(String link) {
        
        List<String> result = Lists.newArrayList();
        
        List<VoteState> activeVotes = steemj.getActiveVotes(
            SteemJConfig.getInstance().getDefaultAccount()
            , new Permlink(link));
        
        for (VoteState voteState : activeVotes) {
            String name = voteState.getVoter().getName();
            log.info("vote user:{}", name);
            result.add(name);
        }
        
        return result;
    }


마지막으로, 아래 함수는 나에 대한 팔로워들에 대한 목록을 추출합니다.

    public List<String> getFollowers() {
        
        List<String> result = Lists.newArrayList();
        
        List<FollowApiObject> followers = steemj.getFollowers(
                SteemJConfig.getInstance().getDefaultAccount(), 
                new AccountName(""), 
                FollowType.BLOG, 
                (short)1000);
        
        for (FollowApiObject item : followers) {
            String name = item.getFollower().getName();
            log.info("follower user:{}", name);
            result.add(name);
        }
        
        return result;
    }


실제 위 세 개의 함수가 주사위 보팅 추출 프로그램의 핵심이라고 보시면 됩니다.

프로그램은 너무 어렵고, 동작되는 걸 보여주세요!


저도 여러분들이 어려워하실 꺼라 생각했습니다.

그래서 간단하게 프로그램이 동작되는 동영상을 만들었습니다. (아래 동영상 링크 참조)

https://steemkr.com/kr/@kanisuka/6yvvj398

프로그램 실행 결과 값입니다.

주사위 숫자가 큰 순서대로 정렬되어 있고, 보팅여부, 팔로잉여부까지 체크가 되어 있는 것을 확인해볼 수 있었습니다.

SteemUserBean(id=sssuy, rand=95, isVoting=true, isFollow=true)
SteemUserBean(id=suin-mom, rand=88, isVoting=true, isFollow=true)
SteemUserBean(id=yuoyster, rand=82, isVoting=true, isFollow=true)
SteemUserBean(id=bighug, rand=78, isVoting=true, isFollow=true)
SteemUserBean(id=kaoticmetal, rand=75, isVoting=true, isFollow=true)
SteemUserBean(id=laylakim, rand=72, isVoting=false, isFollow=true)
SteemUserBean(id=autokjk70, rand=71, isVoting=true, isFollow=true)
SteemUserBean(id=sujisyndrome, rand=61, isVoting=true, isFollow=true)
SteemUserBean(id=shimss, rand=58, isVoting=true, isFollow=true)
SteemUserBean(id=farmerboy, rand=57, isVoting=true, isFollow=true)
SteemUserBean(id=suran, rand=50, isVoting=true, isFollow=true)
SteemUserBean(id=hee4552, rand=35, isVoting=true, isFollow=true)
SteemUserBean(id=norri, rand=35, isVoting=true, isFollow=true)
SteemUserBean(id=gilma, rand=24, isVoting=true, isFollow=true)
SteemUserBean(id=jinibh.house, rand=22, isVoting=true, isFollow=true)
SteemUserBean(id=trueonot, rand=9, isVoting=false, isFollow=true)
SteemUserBean(id=goodhello, rand=6, isVoting=true, isFollow=true)

이번 기회를 통해서, 간단하게나마 스팀잇 기반 프로그램을 하나 만들어보게 되었네요.

저는 프로그램을 아래와 같이 정의하고 싶습니다.

프로그램이란 사람이 수동으로 하는 반복 작업을 편하게 만들어주는 행위이다.

실제 보팅봇과 같은 프로그램도 결국은 사람이 일일이 하나씩 수동으로 했던 작업들을 프로그래밍화 시켜 자동으로 편하게 만들어 놓은 것입니다.

앞으로도 스팀잇 관련 프로그램을 만들 기회가 될 때마다, 하나씩 정리하면서 여러분들에게 손쉽게 설명드리도록 할께요.

이번 포스팅이 잘 설명되었을 지는 모르겠지만, 좀 더 쉽게 설명드리도록 노력하겠습니다.

글이 맘에 드셨다면, 리스팀 부탁드릴께요~!


ps) 후와... 개발만 2시간 걸렸고, 글 쓰고 정리하는 시간까지 합치면, 이 포스팅 하나 작성하는데, 3시간이 걸린 셈이네요. 역시 좋은 글을 쓰는데에도 많은 노력과 시간이 걸리는 것 같습니다.

Sort:  

스스로 홍보하는 프로젝트에서 나왔습니다.
오늘도 좋은글 잘 읽었습니다.
오늘도 여러분들의 꾸준한 포스팅을 응원합니다.

고생하셨습니다~
앞으로 좋은프로그램 많이 만들어주셔요

네~ 감사합니다!

쩝..... dependency하나 더 걸어주면 되게 만들어둔거군요. 저도 시간날 때 해봐야겠습니다. ^^

해보면 그다지 어렵진 않습니다~

좋은 정보 감사합니다~
참고하겠습니다.

넵! 많은 교류해요~

이렇게 하는건가요?
@주사위

오늘은 고래가 보팅을 해줄꺼 같은 날입니다.
@danbain님이 🎲 주사위를 굴려서 96이 나왔습니다.

단바인님 주사위 너무 잘 아시면서 ㅎㅎㅎ
단바인님 이벤트 너무 잘 이용하고 있습니다!

이건 처음해봐서 ㅎㅎㅎ
이벤트할때 활용해봐야겠네요

오.. 지금 딱 저에게 필요한거네요!
API를 파야하는건가 했는데 실력이 안되서 고민고민하던 찰나에 방법을 알랴주셨네요. 부족한 실력으로 시도해봐야겠습니다!
좋은 정보 감사합니다! :)

@주사위
가 뉴비에겐 안된다는 건 몰랐네요.

어제부터 좋은 운은 아니네요.
@tailcock님이 🎲 주사위를 굴려서 35이 나왔습니다.

고생하셨네요ㅋ
주사위쓸때 참고하겠습니다^^