View difference between Paste ID: WC52XYeK and 5LwF8BTa
SHOW: | | - or go back to the newest paste.
1
'''
2
CSGO_STATS_BOT Source Code
3
BETA v0.12 7/29/2014
4
Created by: A highschool student
5
6
How it works:
7
The bot scrapes HLTV.org for certain entries about various players in
8
a post or when summoned with +/u/CSGO_STATS_BOT. It then saves the ID
9
of every post/comment to a text file so it will not comment to the
10
same one twice, preventing spam. Since HLTV.org doesn't neatly create
11
a list of players for me, I had to do it myself with update_Playerlist().
12
The rest of how it works is explained in comments.
13
14
I am going to give a brief explanation of what everything does rather
15
than how I do it because I don't have the time to do that. If you have
16
any question on HOW or WHY I did something, pm me @ /u/CSGO_STATS_BOT.
17
18
Feel free to use/modify this code in anyway you wish except for the
19
reproducing my bot. (i.e I don't want 2 of my bot running around) If
20
you come up with a major change, features, etc that you add to this bot
21
please send me the source code and I will add it in and give you credit
22
where deserved.
23
'''
24
25
import sys
26
import time
27
import praw
28
from time import gmtime, strftime
29
import urllib.request
30
from pprint import pprint
31
32
version = "BETA v0.12"
33
34
#Creates a list of every player in HLTV.org by going through every ID 1-8410 to
35
#check if the name is not N/A and they have played more than 1 map. If their name
36
#is N/A or they haven't played a map, it adds a line N/A in the text file, otherwise
37
#it adds their name. This will be used later.
38
def update_Playerlist(): 
39
    i = file_len("PlayerIDs.txt")
40
    for b in range (1, 841-int(i/10)):
41
        with open("PlayerIDs.txt","a") as f:
42
            for c in range (1, 11):
43
                i = i+1
44
                url = "http://www.hltv.org/?pageid=173&playerid="+str(i)+"&eventid=0&gameid=2"
45
                uf = urllib.request.urlopen(url)
46
                text = str(uf.read())
47
                index = text.index("Player stats: ")+14
48
                name = text[index:].split(" ")[0]
49
                index = text.index("Maps played")+126
50
                maps = int(text[index:index+1])
51
                if name != "N/A" and maps > 0:
52
                     f.write(name+"\n")
53
                     print(str(i)+"- " + name+":"+str(maps))
54
                else:
55
                    f.write("N/A\n")
56
                    print(str(i)+"- " +"N/A")
57
                    
58
#Opens the text file created by update_Playerlist() and adds every name to a list,
59
#the reason I had to have the N/A in the text file was so that here it would keep
60
#the player's ID associated with them. 
61
def getPlayers():
62
    players = []
63
    with open("PlayerIDs.txt") as f:
64
        for line in f:
65
            players.append(line.replace("\n",""))
66
    return players
67
68
#Simply gets the number of lines in a file.
69
def file_len(fname):
70
    with open(fname) as f:
71
        for i, l in enumerate(f):
72
            pass
73
    return i + 1
74
75
#Modified bubble sort I used to sort the players by ranking. I had to have 3 arrays:
76
#Player names: Stored the name of every player
77
#Player Ratings: Stored the rating of every player
78
#Indexes: created in the sort to keep track of where every player moved to.
79
def bubble_sort(arr1,arr2):
80
    indexes = []
81
    for i in range(0, len(arr1)):
82
        indexes.append(i)
83
    unsorted = True
84
    while unsorted:
85
        unsorted = False
86
        for i in range(1,len(arr1)):
87
            if arr2[i] > arr2[i-1]:                
88
                temp = arr2[i]
89
                arr2[i] = arr2[i-1]
90
                arr2[i-1] = temp
91
                
92
                temp = arr1[i]
93
                arr1[i] = arr1[i-1]
94
                arr1[i-1] = temp
95
96
                temp = indexes[i]
97
                indexes[i] = indexes[i-1]
98
                indexes[i-1] = temp
99
                
100
                unsorted = True
101
    return indexes
102
103
#Gets the player infor for every player in list inPost. The data points it gathers
104
#are K/D ratio, Rounds played, Average Kills, Team, HLTV rating, profile URL, Team URL.
105
#I used a VERY crude way of scraping the site for the data I needed. I can't go into
106
#detail without dragging on forever, so PM if you want to know the HOW/WHY behind it.
107
#Then it starts to put together the response with a lot of formatting and the data found.
108
#It calls the bubble_sort method to determine the order of the people in the post.
109
def get_player_info(inPost):
110
    Reply = "Player Name | Primary Team | K/D Ratio | Kills per round | More\n"+":----------|:------------|:---------|:---------------|:-----:\n"
111
    KDs = []
112
    Rounds = []
113
    AverageKills = []
114
    Team = []
115
    TeamURLs = []
116
    Ratings = []
117
    URLs = []
118
        
119
    for i in range (0, len(inPost)):
120
        url = "http://www.hltv.org/?pageid=173&playerid="+str(inPost[i].split("|")[0])+"&eventid=0&gameid=2"
121
        uf = urllib.request.urlopen(url)
122
        text = str(uf.read())
123
        URLs.append(url)
124
            
125
        index = text.index("K/D Ratio")+124
126
        index2 = text[index:].index("</div>")
127
        KDs.append(text[index:index+index2])
128
            
129
        index = text.index("Rounds played")+128
130
        index2 = text[index:].index("</div>")
131
        Rounds.append(text[index:index+index2])
132
133
        index = text.index("Average kills per round")+138
134
        index2 = text[index:].index("</div>")
135
        AverageKills.append(text[index:index+index2])
136
137
        index = text.index("Rating <a href")+259
138
        index2 = text[index:].index("</div>")
139
        Ratings.append(float(text[index:index+index2]))
140
141
        index = text.index("Primary team:")+129
142
        index = index + text[index:].index(">")+1
143
        index2 = text[index:].index("</a>")
144
        Team.append(text[index:index+index2])
145
146
        index = text.index("Primary team:")+138
147
        index2 = text[index:].index("\"")
148
        TeamURLs.append("http://www.hltv.org"+text[index:index+index2].replace("&amp;","&"))
149
        
150
            
151
    if len(inPost) > 0:
152
        indexes=bubble_sort(inPost,Ratings)
153
        for i in range(0, len(inPost)):
154
           # print(str(Ratings[i]) + " " + inPost[i]) 
155
            Reply = Reply + inPost[i].split("|")[1] + " | [" + Team[indexes[i]] + "]("+TeamURLs[indexes[i]]+") | " + KDs[indexes[i]] + " | " + AverageKills[indexes[i]] + " | [HLTV](" + URLs[indexes[i]] + ")\n"
156
        Reply = Reply + "^Players ^ordered ^by ^rating ^on ^HLTV.org  \n\n\n**DISCLAIMER** *You should not use these stats to solely determine your bet, please do more research before you bet as this bot is not responsible for your bets*\n\n Questions? Comments? Improvements? Let me know [on this bot's thread!](http://www.reddit.com/r/csgobetting/comments/2byr6w/player_stats_bot_for_this_subreddit/)\n  \n  \n Moderators, Please remove (or message me about) any spam created by this bot (SORRY!) and message me with any bugs you notice, thanks!  \n*Current Version: " + version + "*"
157
        return Reply
158
    
159
#Stores comment ID to a text file so it doesn't double post.
160
def store_comment_ID(comment):
161
    with open("CommentIDs.txt", "a") as f:
162
        f.write(comment.id+"\n")
163
164
#Stores post ID to a text file so it doesn't double post. 
165
def store_submission_ID(submission):
166
    with open("SubmissionIDs.txt", "a") as f:
167
        f.write(submission.id+"\n")
168
169
#Checks to see if the supplied comment ID has been replied to yet.
170
def check_comment_ID(cid):
171
    with open("CommentIDs.txt") as f:
172
        for line in f:
173
            if cid in line:
174
                return False
175
    return True
176
177
#Checks to see if the supplied post ID has been replied to yet.
178
def check_submission_ID(sid):
179
    with open("SubmissionIDs.txt") as f:
180
        for line in f:
181
            if sid in line:
182
                return False
183
    return True   
184
185
186
#Main method:
187
#Logs into reddit and gets the newest 20 posts to check through.
188
#First it will check for posts with the flair 'Match' so that it only
189
#goes to matches that haven't been finished yet. It checks the selftext
190
#for names and then saves them to a list and send them up to get_player_info()
191
#Next it goes to comments, searching any of the newest 20 posts for the
192
#+/u/CSGO_STATS_BOT summon. Once it finds the summon, it will search the
193
#same way it does the post. Then both post the replies.
194
195
#update_Playerlist() 
196
r = praw.Reddit('Counter Strike:Global Offensive player stats bot version: ' + version)
197
r.login("USERNAME","PASSWORD")
198
already_done = set()
199
players = getPlayers()
200
print ("Bot logged in...")
201
202
while True:
203
    subreddit = r.get_subreddit('csgobetting')
204
    for submission in subreddit.get_new(limit=20):
205
        
206
        #Each Post
207
        inPost = []
208
        if submission.link_flair_text == "Match" and check_submission_ID(submission.id):
209
            text = submission.selftext.replace(","," ").lower().split()
210
            for i in range (0, len(players)):
211
                player = players[i].lower()
212
                if player in text and players[i] != "N/A" and players[i] not in inPost:
213
                    print("Found "+players[i]+"(#"+str(i+1)+") in the post!")
214
                    inPost.append(str(i+1)+"|"+players[i])
215
            try:
216
                submission.add_comment(get_player_info(inPost))
217
                store_submission_ID(submission)
218
            except:
219
                print("Error! not posting(post)")
220
                pass
221
            
222
        #Each comment
223
        inComment = []
224
        submission.replace_more_comments(limit=16, threshold=1)
225
        flat_comments = praw.helpers.flatten_tree(submission.comments)
226
        for comment in flat_comments:
227
            text = comment.body.replace(","," ").lower().split()
228
            if "+/u/csgo_stats_bot" in text and check_comment_ID(comment.id):
229
                for i in range (0, len(players)):
230
                    player = players[i].lower()
231
                    if player in text and players[i] != "N/A" and players[i] not in inComment:
232
                        print("Found "+players[i]+"(#"+str(i+1)+") in a comment!")
233
                        inComment.append(str(i+1)+"|"+players[i])
234
                comment.reply(get_player_info(inComment))
235
                store_comment_ID(comment)
236
    print("Sleeping for 5 minutes. Time of sleep: " + strftime("%m-%d-%Y %H:%M:%S"))
237
    time.sleep(300)