본문 바로가기

[Python]/[Python 프로젝트]

[Python 프로젝트] 자동으로 투표 주제를 올려주는 디스코드 봇

728x90

프로젝트 설명

안녕하세요. 곧 대학생이 되는 고등학생 개발자 주이어입니다. 오늘 보여줄 프로젝트는 '자동으로 투표 주제를 올려주는 디스코드 봇' 입니다. 이 봇은 정해진 시간에 자동으로 투표 주제를 올려주는 데요.

예를 들어서 "월 600만원 직장인 VS 월 200만원 백수" 또는 "짜장면 VS 짬뽕" 이런식으로 의견이 갈릴만한 주제를 올려주게 됩니다. 이 봇을 만든 이유는 디스코드에 새로운 이야깃거리를 주면서 디스코드 서버 참여자들의 활동률을 높이기 위해서 입니다. 

 

코드상세 설명

기본 CODE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import discord
import time
from datetime import datetime
import random
 
 
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
 
@client.event
async def on_ready():
    print(client.user.id)
    print("ready")
    bar = discord.Game("투표 주제 생각")
    await client.change_presence(status=discord.Status.online, activity=bar)
cs

프로젝트 제작에 필요한 모듈들을 다운받고 디스코드 봇을 준비시키는 CODE 입니다.

 

투표주제 리스트 CODE

1
2
3
4
5
6
7
8
9
vote_list = [["밥? 면?","밥🍚","밥심이 최고다.","면🍜","면이 찰지다.","🍚","🍜"], ["깻잎 떼주기 가능?","가능⭕","그저 호의다.","불가능❌","호의 아닌 호감이다.","⭕","❌"],["탕수육 찍먹? 부먹?","부먹⭕","원래 부어먹는 음식이다.","찍먹❌","찍어먹어야 바삭하다.","⭕","❌"],["파인애플 피자 먹기","좋다⭕","파인애플이 느끼한걸 잡아준다.","싫다❌","새콤하고 맛없다.","⭕","❌"],
             ["닭이 먼저? 달걀이 먼저?","닭🐔","달걀은 닭이 낳음.","달걀🥚","닭은 달걀이 부화한거임.","🐔","🥚"],["딱딱한 복숭아 VS 물렁한 목숭아","딱복🍑","딱딱해야 씹는 맛이 있다.","물복🔵","입에서 녹는 부드러운 맛이 있다.","🍑","🔵"],["사자 vs 호랑이, 누가 맹수의 왕인가","사자🦁","사자다.","호랑이🐯","호랑이다.","🦁","🐯"],["빨대구멍의 개수는 1개인가 2개인가","1개1️⃣","1개다.","2개2️⃣","2개다.","1️⃣","2️⃣"],
             ["콩국수에 소금 VS 콩국수에 설탕","소금🧂","짭짜름한게 맛있다.","설탕🫙","달달한게 맛있다.","🧂","🫙"],["여름 VS 겨울 평생 한 계절로 살아야 한다면?","여름☀️","더운게 추운것보다 낫다.","겨울❄️","추운게 더운것보다 낫다.","☀️","❄️"],["슈크림 붕어빵 vs 팥 붕어빵","슈크림🟡","달달한 슈크림이 맛있다.","팥⚫","팥이 근본이다.","🟡","⚫"],
             ["용의꼬리 VS 뱀의머리 무엇으로 살것인가?","용의꼬리🐉","꼬리로 살아도 용은 용이다.","뱀의머리🐍","용이 아니더라도 머리로 사는게 낫다.","🐉","🐍"],["민트초코","좋다⭕","상큼한 맛!","싫다❌","치약 맛 웩...","⭕","❌"],["게임 셧다운제 필요한가?","필요하다⭕","건강한 청소년의 게임 생활을 위해서 필요하다.","불필요하다❌","게임을 하는 것은 자율적으로 해야한다.","⭕","❌"],
             ["여행 스타일 휴향형 VS 활동형","휴향형🛌","여행은 쉬러 가는 것이다.","활동형🏃‍♂️","여행은 구경하러 가는 것이다.","🛌","🏃‍♂️"],["애니메이션 VS 영화","애니메이션💻","애니메이션이 재밌다.","영화📹","영화가 재밌다.","💻","📹"],["아이폰 VS 갤럭시","아이폰🍎","아이폰이 최고다.","갤럭시📱","갤럭시가 최고다.","🍎","📱"],["월 600만원 직장인 VS 월 150만원 백수","직장인🧑‍💼","월 600만원이면 회사 다닐만 하다.","백수🎮","돈이 조금 부족하더라도 놀면서 사는게 최고다.","🧑‍💼","🎮"],
             ["맛있는 음식 먼저? 나중에?","먼저🍕","맛있는 음식은 먼저 먹어야 한다.","나중에🥗","맛있는 음식은 나중에 먹어야 한다.","🍕","🥗"],["더욱 무서운 것은?","침대 밑에 사람🧑","사람이 더 무섭다.","침대 밑에 귀신👻","귀신이 더 무섭다.","🧑","👻"],["아는 것과 모르는 것","아는 것⭕","아는 것이 힘이다.","모르는 것❌","모르는 것이 약이다.","⭕","❌"],
             ["된장찌개 VS 김치찌개","된장찌개⭕","구수한 된장찌개가 맛있다.","김치찌개❌","시원한 국물인 김치찌개가 맛있다.","⭕","❌"],["대학교육은 무상이어야 할까?","무상⭕","그렇다. 무상이어야 한다.","유상❌","아니다. 유상이어야 한다.","⭕","❌"],["대학은 꼭 가야 할까?","그렇다⭕","시대가 어떻든 대학은 꼭 가야한다.","아니다❌","지금 시대는 대학이 필수가 아니다.","⭕","❌"],
             ["의무투표제를 시행해야 할까?","그렇다⭕","모든 국민의 의견을 반영한 정치가 필요하다.","아니다❌","투표를 하지 않고 의견을 밝히지 않는 것도 권리이다.","⭕","❌"],["콜라 VS 사이다","콜라⭕","콜라가 맛있다.","사이다❌","사이다가 맛있다.","⭕","❌"],["콜라 VS 제로콜라","콜라⭕","제로콜라는 이름만 콜라고 콜라 맛이 아니다.","제로콜라❌","살안찌는 콜라? 이건 못참는다.","⭕","❌"],
             ["축구 VS 야구","축구⚽","축구가 더 재밌다.","야구⚾","야구가 더 재밌다.","⚽","⚾"],["짜장면 VS 짬뽕","짜장면⭕","단무지와 함께 먹는 달달한 짜장면이 맛있다.","짬뽕❌","얼큰한 국물과 함께 먹는 짬뽕이 맛있다.","⭕","❌"],["물냉면 VS 비빔냉면","물냉면⭕","시원한 물냉면이 맛있다.","비빔냉면❌","매콤한 비빔냉면이 맛있다.","⭕","❌"]]
cs

투표주제 목록이 담긴 리스트입니다. 밑에 있는 코드를 줄이다보니 리스트가 길어졌습니다.

 

MAIN CODE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@client.event
async def on_message(message):
    global vote_list
    if message.content.startswith('!작동'):
        await message.channel.send("`앞으로 15시, 20시에 자동으로 투표주제가 올라갑니다.`")
        await message.channel.send("`현재 준비되어 있는 투표주제의 갯수는 " + str(len(vote_list)) + "개 입니다.`")
        while True:
            while True:
                now = datetime.now()
                current_time = now.strftime("%H:%M")
                if current_time == "15:00" or current_time == "20:00":
                    break
                elif current_time == "12:00":
                    temp = random.randint(1,100)
                    print(temp)
                    if temp <= 50:
                        await message.channel.send("`TIP! 투표는 15시, 20시에 자동으로 투표주제가 올라갑니다!`")
                    else:
                        pass
                    time.sleep(60)
 
            temp = random.randint(1,len(vote_list))
            embed = discord.Embed(title="투표주제",description=vote_list[temp-1][0], color=0x00aaaa)
            embed.add_field(name=vote_list[temp-1][1], value=vote_list[temp-1][2], inline=False)
            embed.add_field(name=vote_list[temp-1][3], value=vote_list[temp-1][4], inline=False)
            msg = await message.channel.send(embed=embed)
            await msg.add_reaction(vote_list[temp-1][5])
            await msg.add_reaction(vote_list[temp-1][6])
            time.sleep(120)
    else:
        pass
 
    if message.content.startswith("!테스트"):
        msg = await message.channel.send("⭕")
        await msg.add_reaction("⭕")
 
 
client.run("ㅂ")
cs

정해진 시간에 투표주제를 랜덤으로 골라 채팅창에 올리는 메인이 되는 CODE 입니다.

time 모듈을 이용하여 투표주제가 여러개 올라가는 것을 막고,

datetime 모듈을 이용하여 현재시간을 구해 정해진 시간에 투표주제가 올라가도록 만들었습니다.

추가적인 기능으로는 매일 12시에 50%확률로 TIP을 보내도록 설정했습니다.

아무래도 무한반복을 이용하여 코드를 짜다보니 다른 코드들은 작동하지 않기 때문에 이렇게 TIP을 보내도록 만들었습니다.

 

실제 작동 사진

디스코드 봇 작동 사진

위에 사진은 투표 봇이 작동하는 사진입니다. 테스트를 하기 위해서 투표가 올라오는 시간을 오전 12시 3분에 맞춰둔 거구요. 실제로는 15시, 20시에 자동으로 투표가 올라옵니다.

 

후기

이런식으로 봇을 만들어서 활용한다면 굳이 큰 힘 들이지 않고도 서버 참여자들의 활동률을 높일 수 있을 것 같다는 생각이 들었습니다. 또 고3 생활을 끝내고 오랜만에 코딩을 하니 더 재미있는 것 같았습니다. 이제 며칠 뒤면 저도 대학생이라는게 믿기지 않네요.. 이제는 고등학생 개발자가 아니라 대학생 개발자로 갈아타야 할 것 같습니다. 

 

밑에는 이 글과 비슷한 글의 링크입니다. 밑에 글도 한번씩 읽어주시면 감사하겠습니다.

https://juyear-coding.tistory.com/59

 

[Python 프로젝트 소개] 공부를 도와주는 디스코드 봇 프로젝트

프로젝트 설명 안녕하세요. 고등학생 개발자 주이어입니다. 오늘 소개할 프로젝트는 제가 고등학교 1학년 때 만든 공부를 도와주는 디스코드 봇입니다. 작동 방식은 사용자가 추가한 문제들 중

juyear-coding.tistory.com

(공부를 도와주는 디스코드 봇 만들기 프로젝트)


728x90