신기성

요소 정리

1 +//http연동
2 +var express=require('express');
3 +var app=express();
4 +var router=require('./router/main')(app);
5 +
6 +app.set('views', __dirname + '/views');
7 +app.set('view engine', 'ejs');
8 +app.engine('html', require('ejs').renderFile);
9 +
10 +var server=app.listen(3000,function(){
11 + console.log("Express server has started on port 3000");
12 +
13 + });//app listen 꿑
14 +
15 +//
16 +/*
17 +var readline=require('readline');//입력받기 위한 모듈
18 +var r=readline.createInterface({input:process.stdin,output:process.stdout});//키보드 입출력 정의
19 +var rtfw1="http://www.rankedftw.com/search/?name=";//rtfw에서 기본 검색 url
20 +var rtfw2="http://www.rankedftw.com/player/"//rtfw 번호 기반 특정 플레이어 검색 url
21 +var league='silver_2';
22 +var region='KR';
23 +//
24 +var cheerio=require('cheerio');//cheerio모듈 사용
25 +var request=require('request');//request모듈 사용
26 +var fs=require('fs');//파일시스템 사용
27 +//
28 +//request 1 variable
29 +var username='';//username문자열 선언
30 +var userleague='';//userleague 문자열 선언
31 +var userregion='';//userregion 문자열 선언
32 +var usernumber='';//usernumber 문자열 선언
33 +//
34 +//request 2 variable
35 +
36 +//
37 +//request 3-1 variable
38 +
39 +//
40 +//request 3-2 variable
41 +
42 +//
43 +//request 3-3 variable
44 +
45 +//
46 +//system message
47 +
48 +//
49 +//delivering variable
50 +var momentum;//기세
51 +var terran_proficiency;//테란 숙련도
52 +var zerg_proficiency;//저그 숙련도
53 +var protoss_proficiency;//프로토스 숙련도
54 +var primary_race;//주 종족
55 +var win_rate;//시즌 전체 승률
56 +
57 +var myrace;//내 종족
58 +var enemyrace;//상대 종족
59 +var recommend;//추천빌드(운영/타이밍/올인)
60 +//
61 +
62 +r.question("분석을 원하는 아이디를 입력하세요 : ",function(answer){//question메소드에서 callback함수 생성
63 + //question은 에러 제어 만들면 안된다.
64 + console.log("r.question processing");//callback함수란 이벤트가 왔을 때 실행되는 함수이다. answer에 검색을 원하는 아이디가 담겨있다.
65 + rtfw1=rtfw1+answer;//검색 url 구성
66 + console.log(rtfw1);//테스트용 : 검색 url 확인
67 +//
68 +request(rtfw1,(error,response,body)=>{//rtfw url 불러오기 request 1
69 + if(error){throw error};//에러처리
70 + console.log("request 1 processing");
71 + let $ = cheerio.load(body);//rtfw가 body이다. $로 jquery방식으로 html탐색
72 + $('ul').find('a').each(function(index,elem){//ul 태그 아래 a태그를 찾는다.
73 + username=$(this).find('.name').text().trim();//name클래스를 찾아 공백빼고 텍스트화
74 + userleague=$(this).find('.league').text().trim();//league클래스를 찾아 공백빼고 텍스트화
75 + userregion=$(this).find('.region').text().trim();//region클래스를 찾아 공백빼고 텍스트화
76 + if((username===answer)&&(userregion===region)){//아직 리그 구현 안함-리그는 그림으로 비교
77 + console.log(`${username}`);//테스트용 : 유저네임 출력
78 + console.log(`${userregion}`);//테스트용 : 유저리전 출력
79 + var usernumber=$(this).toString().slice(29,43);//rtfw에서 사용하는 사용자번호를 문자열로 넉넉히 자름
80 + var localindex1=usernumber.search('/');//첫번째 슬레시 발견하는 인덱스 검출
81 + usernumber=usernumber.slice(localindex1+1);//앞부분 슬래시 자른다.
82 + var localindex2=usernumber.search('/')-localindex1+1;//두번째 슬레시 발견하는 인덱스 검출
83 + usernumber=usernumber.slice(0,localindex2);//뒷부분 슬래시 자른다.
84 + console.log(`${usernumber}`);//테스트용 : 유저넘버 출력
85 + if(rtfw2.length>33){//하나라도 붙어있으면
86 + rtfw2=rtfw2;//아무것도 안한다.
87 + }else{//그렇지않고 아무것도 안붙어있으면
88 + rtfw2=rtfw2+usernumber+'/';//rtfw2 url갱신
89 + }
90 + console.log(rtfw2);//테스트용 : rtfw2 출력
91 + }//이름서버리그비교if종료
92 + });//ul a find문 종료
93 +
94 + var profileID='';
95 + request(rtfw2,(error,response,body)=>{//rtfw2 url 불러오기 request 2
96 + if(error){throw error};//에러처리
97 + console.log('request2 processing');//테스트용 : request2 실행여부 출력
98 + let $ = cheerio.load(body);//rtfw2가 body이다. $로 jquery방식으로 html탐색
99 + $('.content').find('.bnet-link').each(function(index,elem){//content 클래스 안의 bnet-link클래스를 포함하는 요소를 찾는다.
100 + profileID=$(this).toString().slice(62,72);//얻고자 하는 profileID를 포함하여 앞뒤로 적당히 자른다.
101 + var localindex3=profileID.search('/');//첫번째 슬레시 발견하는 인덱스 검출
102 + profileID=profileID.slice(localindex3+1);//앞부분 슬래시 자른다.
103 + var localindex4=profileID.search('/')-localindex3;//두번째 슬레시 발견하는 인덱스 검출
104 + profileID=profileID.slice(0,localindex4);//뒷부분 슬래시 자른다.
105 + console.log(`${profileID}`);//테스트용 : profileID 출력
106 + //profileID=encodeURI(encodeURIComponent(profileID));//한글처리부
107 + });//a bnetlink 종료
108 +//console.log(`${profileID}`);//테스트용 : profileID 출력
109 +
110 +var match_history_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"//매치히스토리 url 앞부분
111 +var match_history_2="/matches?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi"//매치히스토리 url 뒷부분
112 +var match_history_url=match_history_1+profileID+match_history_2;//매치히스토리 url 구성
113 +console.log(match_history_url);//테스트용 : 매치히스토리 url 출력
114 +
115 +request(match_history_url,(error,response,body)=>{//match history request request 3
116 + if(error){throw error};//에러처리
117 + console.log('request3 processing');//테스트용 : request 작동여부 출력
118 +
119 +var obj1=JSON.parse(body);//request 결과를 JSON object로 변환
120 +//console.log(obj.matches [0].map);//테스트용 : 하나에 접근
121 +$(obj1.matches).each(function(index,match){//body에서 각각의 배열요소 match들과 인덱스 사용
122 + if(match.type=='1v1'){//경기타입이 1대1인 경우에만 관심있다.
123 + console.log(index+":::",match.decision,match.map);//인덱스와 승패, 맵 표시
124 +};//if 1v1 종료
125 +});//each function 종료
126 +
127 +var ladder_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/"
128 +var ladder_2="/ladders?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi";
129 +var ladder_url=ladder_1+profileID+ladder_2;
130 +console.log(ladder_url);
131 +request(ladder_url,(error,response,body)=>{//ladder request request 4
132 + if(error){throw error};
133 + console.log('request4 processing');
134 + var obj2=JSON.parse(body);//request 결과를 JSON object로 변환
135 +// console.log(obj2.currentSeason [2].ladder[0].wins);//테스트용 : 하나에 접근
136 + var wins=obj2.currentSeason[2].ladder[0].wins;
137 + var losses=obj2.currentSeason[2].ladder[0].losses;
138 +win_rate=wins/(wins+losses);
139 + //console.log(wins);
140 + //console.log(losses);
141 + //console.log(win_rate);
142 +
143 +var profile_1="https://kr.api.blizzard.com/sc2/legacy/profile/3/1/";
144 +var profile_2="?access_token=US0q3wV6W1fIYZmRnEBbNvUrRHYZhwANIi";
145 +var profile_url=profile_1+profileID+profile_2;
146 +console.log(profile_url);
147 +request(profile_url,(error,response,body)=>{//profile request request 5
148 + if(error){throw error};
149 + console.log('request5 processing');
150 + var obj3=JSON.parse(body);//request 결과를 JSON object로 변환
151 + //console.log(obj2.currentSeason [1].ladder[0].wins);//테스트용 : 하나에 접근
152 +primary_race=obj3.career.primaryRace;
153 + //console.log(primary_race);
154 + var terran_level=obj3.swarmLevels.terran.level;
155 + var zerg_level=obj3.swarmLevels.zerg.level;
156 + var protoss_level=obj3.swarmLevels.protoss.level;
157 +
158 + //console.log(terran_level);
159 + //console.log(zerg_level);
160 + //console.log(protoss_level);
161 +
162 +//build recommend algorithm
163 +var matchresults=[];//매치결과 담을 배열 선언
164 +var momentum_win=0;//최근 10경기 중 승수 초기화
165 +for (var i=0;i<25;i++){//매치히스토리는 최대 25개
166 + if(obj1.matches[i].type=='1v1'){//1v1에만 관심있다.
167 + matchresults.push(obj1.matches[i].decision);//배열 끝에 결과 삽입
168 + if((matchresults.length<11)&&(obj1.matches[i].decision=='Win')){//최근 10경기에서 승리한 경우
169 + momentum_win=momentum_win+1;//그 승수를 카운트한다.
170 + }//if length11 종료
171 +}//obj1 1v1 종료
172 +}//for i 25 종료
173 +//console.log(matchresults);//테스트용 : matchresults 출력
174 +//console.log(momentum_win);//테스트용 : momentum_win 출력
175 +if(momentum_win>=7){//7승 이상이면 상승세
176 +momentum='상승세';
177 +}
178 +if((momentum_win<7)&&(momentum_win>=4)){//4승이상 7승미만이면 정체
179 +momentum='정체중';
180 +}
181 +if(momentum_win<4){//4승 미만이면 하락세
182 +momentum='하락세';
183 +}
184 +//console.log(momentum);//테스트용 : 기세 출력
185 +
186 +if(terran_level<50){//테란 레벨 50 안되면
187 + terran_proficiency='비숙련자'//테란 비숙련자
188 +} else{
189 + terran_proficiency='숙련자'
190 +}
191 +if(zerg_level<50){//저그 레벨 50 안되면
192 + zerg_proficiency='비숙련자'//저그 비숙련자
193 +} else{
194 + zerg_proficiency='숙련자'
195 +}
196 +if(protoss_level<50){//프로토스 레벨 50 안되면
197 + protoss_proficiency='비숙련자'//프로토스 비숙련자
198 +} else{
199 + protoss_proficiency='숙련자'
200 +}
201 +//
202 +//system message part
203 +console.log("최근 10경기 분석 결과 현재 상대는 '"+momentum+"'입니다.");
204 +console.log("상대는 테란 '"+terran_proficiency+"'입니다.");
205 +console.log("상대는 저그 '"+zerg_proficiency+"'입니다.");
206 +console.log("상대는 프로토스 '"+protoss_proficiency+"'입니다.");
207 +console.log("상대의 주 종족은 '"+primary_race+"'입니다.");
208 +console.log("상대의 이번 시즌 전체 승률은 '"+win_rate+"'입니다.");
209 +//
210 +//build recommend command
211 +
212 +//
213 +
214 +console.log('request5 done');
215 +});//request5종료
216 +console.log('request4 done');
217 +});//request4종료
218 +console.log('request3 done');
219 +});//request3종료
220 +console.log('request2 done');
221 +});//request2종료
222 +console.log('request1 done');
223 +});//request1 종료
224 +
225 +console.log('r.question done');
226 +//console.log(terran_level);
227 +r.close()//반드시 close를 해줘야 한다.사용이 다 끝난 후에.
228 +});//r.question 끝
229 +*/
This diff is collapsed. Click to expand it.
1 +<!DOCTYPE html>
2 +<html lang="ko-kr">
3 +<head>
4 + <meta charset="utf-8">
5 + <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen">
6 + <link href="/static/core/style.css" rel="stylesheet" media="screen">
7 + <script async="" src="//www.google-analytics.com/analytics.js"></script>
8 + <script type="text/javascript" async="" src="//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js"></script>
9 + <title>StarCraft 2 Build Recommendation Project</title>
10 +<body>
11 +
12 +<h1><%= data%></h1>
13 +
14 +
15 +<p stype="fond-family:verdana;">StarCraft 2 Build Recommendation Project</p>
16 +<img src="logoIMG.jpg" alt="StarCraft2 LOGO image">
17 +<br>
18 +<br>
19 +
20 +<div class="col-md-3">
21 + <form id="searchform" action method="get">
22 + <div id="div_id_race" class="form-group">
23 + <label for="id_sort_by" class="control-label ">
24 + 종족
25 + </label>
26 + <div class="controls">
27 + <select class="select form-control" id="id_sort_by" name="sort_by">
28 + <option value="t">테란</option>
29 + <option value="r">저그</option>
30 + <option value="a">프로토스</option>
31 + </select>
32 +</div>
33 +<a class="btn btn-primary" href="/build/create/">빌드</a>
34 +<br>
35 +<br>
36 +<a href="https://starcraft2.com/ko-kr/game">Official Site</a>
37 +</body>
38 +</html>