Showing
1 changed file
with
358 additions
and
29 deletions
| ... | @@ -18,9 +18,8 @@ const sslport = 23023; | ... | @@ -18,9 +18,8 @@ const sslport = 23023; |
| 18 | 18 | ||
| 19 | app.use(bodyParser.json()); | 19 | app.use(bodyParser.json()); |
| 20 | //전역변수 선언 | 20 | //전역변수 선언 |
| 21 | -var isstart; | 21 | + |
| 22 | -var isforecast = 0; | 22 | +//var jsonForforecast; |
| 23 | -var jsonForforecast; | ||
| 24 | // body-parser를 이용해 application/x-www-form-urlencoded 파싱 | 23 | // body-parser를 이용해 application/x-www-form-urlencoded 파싱 |
| 25 | app.use(bodyParser.urlencoded({ extended: false })) | 24 | app.use(bodyParser.urlencoded({ extended: false })) |
| 26 | 25 | ||
| ... | @@ -81,62 +80,122 @@ app.use('/', router); | ... | @@ -81,62 +80,122 @@ app.use('/', router); |
| 81 | 80 | ||
| 82 | 81 | ||
| 83 | function ishello(istext){ | 82 | function ishello(istext){ |
| 84 | - if (istext == '종료'){ | ||
| 85 | - return false; | ||
| 86 | - } | ||
| 87 | if(istext == '안녕'){ | 83 | if(istext == '안녕'){ |
| 88 | return true; | 84 | return true; |
| 89 | } | 85 | } |
| 86 | + else{ | ||
| 87 | + return false; | ||
| 88 | + } | ||
| 90 | } | 89 | } |
| 91 | 90 | ||
| 92 | -function firstforecast(isforecast, eventObj){ | 91 | +function firstforecast(isforecast){ |
| 93 | if(isforecast == '1'){ | 92 | if(isforecast == '1'){ |
| 94 | - return 1; | 93 | + return true; |
| 95 | } | 94 | } |
| 96 | else if(isforecast == '2'){ | 95 | else if(isforecast == '2'){ |
| 97 | - return 2; | 96 | + return true; |
| 97 | + }else { | ||
| 98 | + return false; | ||
| 99 | + } | ||
| 100 | +} | ||
| 101 | + | ||
| 102 | +function selecttypeforecast(istype){ | ||
| 103 | + if(istype == '버스'){ | ||
| 104 | + return true; | ||
| 105 | + } | ||
| 106 | + else if (istype == '일반'){ | ||
| 107 | + return true; | ||
| 98 | } | 108 | } |
| 99 | else{ | 109 | else{ |
| 100 | - helloworld(eventObj); | 110 | + return false; |
| 101 | - return; | ||
| 102 | } | 111 | } |
| 103 | } | 112 | } |
| 113 | + | ||
| 114 | +function typeforecast(typetext){ | ||
| 115 | + if(typetext == '버스서울'){ | ||
| 116 | + return true; | ||
| 117 | + } | ||
| 118 | + else if (typetext == '버스지방'){ | ||
| 119 | + return true; | ||
| 120 | + } | ||
| 121 | + else if (typetext== '일반서울'){ | ||
| 122 | + return true; | ||
| 123 | + } | ||
| 124 | + else if(typetext == '일반지방'){ | ||
| 125 | + return true; | ||
| 126 | + } | ||
| 127 | + else false; | ||
| 128 | +} | ||
| 129 | + | ||
| 130 | + | ||
| 104 | app.post('/hook', function (req, res) { | 131 | app.post('/hook', function (req, res) { |
| 132 | + //console.log(jsonForforecast); | ||
| 105 | 133 | ||
| 134 | + var isstart; | ||
| 135 | + var isforecast; | ||
| 136 | + var isselecttypeforecast; | ||
| 137 | + var istypeforecast; | ||
| 106 | var eventObj = req.body.events[0]; | 138 | var eventObj = req.body.events[0]; |
| 107 | var source = eventObj.source; | 139 | var source = eventObj.source; |
| 108 | var message = eventObj.message; | 140 | var message = eventObj.message; |
| 141 | + | ||
| 109 | // request log | 142 | // request log |
| 110 | console.log('======================', new Date() ,'======================'); | 143 | console.log('======================', new Date() ,'======================'); |
| 111 | console.log('[request]', req.body); | 144 | console.log('[request]', req.body); |
| 112 | console.log('[request source] ', source); | 145 | console.log('[request source] ', source); |
| 113 | console.log('[request message]', message); | 146 | console.log('[request message]', message); |
| 114 | 147 | ||
| 115 | - isstart = ishello(message.text); | ||
| 116 | - isforecast = firstforecast(message.text, eventObj); | ||
| 117 | 148 | ||
| 149 | + isstart = ishello(message.text); | ||
| 118 | if(isstart == true){ | 150 | if(isstart == true){ |
| 119 | console.log('[request hello] ', message); | 151 | console.log('[request hello] ', message); |
| 120 | //console.log(count); | 152 | //console.log(count); |
| 121 | - helloworld(eventObj ); | 153 | + helloworld(eventObj); |
| 122 | - isstart = false; | ||
| 123 | - } | ||
| 124 | - if(isstart == false){ | ||
| 125 | - console.log('사용자가 종료를 입력했습니다.'); | ||
| 126 | - isforecast = null; | ||
| 127 | } | 154 | } |
| 128 | 155 | ||
| 129 | - if(isforecast == 1){ | 156 | + isforecast = firstforecast(message.text); |
| 157 | + if(isforecast){ | ||
| 158 | + if(message.text == '1'){ | ||
| 130 | console.log('[request Order] ', message); | 159 | console.log('[request Order] ', message); |
| 131 | findroad(eventObj); | 160 | findroad(eventObj); |
| 132 | } | 161 | } |
| 133 | - else if (isforecast == 2){ | 162 | + else if (message.text == '2'){ |
| 134 | console.log('[request Order] ', message); | 163 | console.log('[request Order] ', message); |
| 135 | viewhtml(eventObj); | 164 | viewhtml(eventObj); |
| 136 | } | 165 | } |
| 166 | + } | ||
| 137 | 167 | ||
| 168 | + isselecttypeforecast = selecttypeforecast(message.text); | ||
| 169 | + if(isselecttypeforecast == true){ | ||
| 170 | + if( message.text == '버스'){ | ||
| 171 | + console.log('버스에보') | ||
| 172 | + busforecast(eventObj); | ||
| 173 | + } | ||
| 174 | + else if(message.text == '일반'){ | ||
| 175 | + console.log('일반예보'); | ||
| 176 | + normalforecast(eventObj); | ||
| 177 | + } | ||
| 178 | + } | ||
| 138 | 179 | ||
| 139 | - | 180 | + istypeforecast = typeforecast(message.text); |
| 181 | + if(istypeforecast == true){ | ||
| 182 | + if( message.text == '버스서울'){ | ||
| 183 | + console.log('버스에보') | ||
| 184 | + busforecasttoS(eventObj); | ||
| 185 | + } | ||
| 186 | + else if(message.text == '버스지방'){ | ||
| 187 | + console.log('버스예보'); | ||
| 188 | + busforecasttoG(eventObj); | ||
| 189 | + } | ||
| 190 | + else if(message.text == '일반서울'){ | ||
| 191 | + console.log('일반예보') | ||
| 192 | + normalforecasttoS(eventObj, jsonForforecast); | ||
| 193 | + } | ||
| 194 | + else if(message.text == '일반지방'){ | ||
| 195 | + console.log('일반에보'); | ||
| 196 | + normalforecasttoG(eventObj, jsonForforecast); | ||
| 197 | + } | ||
| 198 | + } | ||
| 140 | 199 | ||
| 141 | res.sendStatus(200); | 200 | res.sendStatus(200); |
| 142 | }); | 201 | }); |
| ... | @@ -187,10 +246,82 @@ function viewhtml(eventObj){ | ... | @@ -187,10 +246,82 @@ function viewhtml(eventObj){ |
| 187 | { | 246 | { |
| 188 | "type":"text", | 247 | "type":"text", |
| 189 | "text":"https://www.chyoss.tk:23023/public/maprealtime.html" | 248 | "text":"https://www.chyoss.tk:23023/public/maprealtime.html" |
| 249 | + } | ||
| 250 | + ] | ||
| 251 | + } | ||
| 252 | + },(error, response, body) => { | ||
| 253 | + console.log(body) | ||
| 254 | + }); | ||
| 255 | +} | ||
| 256 | + | ||
| 257 | + | ||
| 258 | + | ||
| 259 | +function findroad(eventObj){ | ||
| 260 | + jsonforecast(function(object){ | ||
| 261 | + var obj = object; | ||
| 262 | + var jsonForforecast = obj; | ||
| 263 | + console.log(jsonForforecast); | ||
| 264 | + var year = jsonForforecast.list[0].sdate.substr(0,4); | ||
| 265 | + var month = jsonForforecast.list[0].sdate.substr(4,2); | ||
| 266 | + var day = jsonForforecast.list[0].sdate.substr(6,2); | ||
| 267 | + var hour = jsonForforecast.list[0].stime.substr(0,2); | ||
| 268 | + var min = jsonForforecast.list[0].stime.substr(2,2); | ||
| 269 | + request.post( | ||
| 270 | + { | ||
| 271 | + url: TARGET_URL, | ||
| 272 | + headers: { | ||
| 273 | + 'Authorization': `Bearer ${TOKEN}` | ||
| 274 | + }, | ||
| 275 | + json: { | ||
| 276 | + "replyToken":eventObj.replyToken, | ||
| 277 | + "messages":[ | ||
| 278 | + { | ||
| 279 | + "type":"text", | ||
| 280 | + "text":"교통예보를 시작합니다." | ||
| 281 | + }, | ||
| 282 | + { | ||
| 283 | + "type":"text", | ||
| 284 | + "text": year + '년 ' + month + "월 " + day + "일 " + hour + ":" + min + "기준입니다." | ||
| 285 | + }, | ||
| 286 | + { | ||
| 287 | + "type":"text", | ||
| 288 | + "text": '현재 전국 교통량은 대략' + jsonForforecast.list[0].cjunkook + '대 이며, 지방방향 교통량은 대략 ' + jsonForforecast.list[0].cjibangDir + '대, 서울방향 교통량은 대략 ' + jsonForforecast.list[0].cseoulDir + '대입니다.' | ||
| 289 | + }, | ||
| 290 | + { | ||
| 291 | + "type":"text", | ||
| 292 | + "text":"버스기준으로 보시겠습니까 아니면 일반 승용차 기준으로 보시겠습니까? 버스기준으로 보실려면 '버스'를, 일반 승용차 기준으로 보실려면 '일반'을 입력해 주세요." | ||
| 293 | + } | ||
| 294 | + ] | ||
| 295 | + } | ||
| 296 | + },(error, response, body) => { | ||
| 297 | + console.log(body) | ||
| 298 | + }); | ||
| 299 | + }); | ||
| 300 | + | ||
| 301 | +} | ||
| 302 | + | ||
| 303 | + | ||
| 304 | +function busforecast(eventObj){ | ||
| 305 | + request.post( | ||
| 306 | + { | ||
| 307 | + url: TARGET_URL, | ||
| 308 | + headers: { | ||
| 309 | + 'Authorization': `Bearer ${TOKEN}` | ||
| 310 | + }, | ||
| 311 | + json: { | ||
| 312 | + "replyToken":eventObj.replyToken, | ||
| 313 | + "messages":[ | ||
| 314 | + { | ||
| 315 | + "type":"text", | ||
| 316 | + "text":"버스 예보를 시작합니다." | ||
| 317 | + }, | ||
| 318 | + { | ||
| 319 | + "type":"text", | ||
| 320 | + "text":"'서울발 지방행' 교통예보는 '버스서울'을," | ||
| 190 | }, | 321 | }, |
| 191 | { | 322 | { |
| 192 | "type":"text", | 323 | "type":"text", |
| 193 | - "text":"종료를 입력하시면 종료됩니다." | 324 | + "text":"'지방발 서울행' 교통예보는 '버스지방'을 입력해주세요" |
| 194 | } | 325 | } |
| 195 | ] | 326 | ] |
| 196 | } | 327 | } |
| ... | @@ -201,10 +332,41 @@ function viewhtml(eventObj){ | ... | @@ -201,10 +332,41 @@ function viewhtml(eventObj){ |
| 201 | 332 | ||
| 202 | 333 | ||
| 203 | 334 | ||
| 204 | -function findroad(eventObj){ | 335 | +function normalforecast(eventObj){ |
| 336 | + request.post( | ||
| 337 | + { | ||
| 338 | + url: TARGET_URL, | ||
| 339 | + headers: { | ||
| 340 | + 'Authorization': `Bearer ${TOKEN}` | ||
| 341 | + }, | ||
| 342 | + json: { | ||
| 343 | + "replyToken":eventObj.replyToken, | ||
| 344 | + "messages":[ | ||
| 345 | + { | ||
| 346 | + "type":"text", | ||
| 347 | + "text":"일반 승용차 예보를 시작합니다." | ||
| 348 | + }, | ||
| 349 | + { | ||
| 350 | + "type":"text", | ||
| 351 | + "text":"'서울발 지방행' 교통예보는 '일반서울'을," | ||
| 352 | + }, | ||
| 353 | + { | ||
| 354 | + "type":"text", | ||
| 355 | + "text":"'지방발 서울행' 교통예보는 '일반지방'을 입력해주세요" | ||
| 356 | + } | ||
| 357 | + ] | ||
| 358 | + } | ||
| 359 | + },(error, response, body) => { | ||
| 360 | + console.log(body) | ||
| 361 | + }); | ||
| 362 | +} | ||
| 363 | + | ||
| 364 | + | ||
| 365 | + | ||
| 366 | +function busforecasttoS(eventObj){ | ||
| 205 | jsonforecast(function(object){ | 367 | jsonforecast(function(object){ |
| 206 | var obj = object; | 368 | var obj = object; |
| 207 | - jsonForforecast = obj; | 369 | + var jsonForforecast = obj; |
| 208 | console.log(jsonForforecast); | 370 | console.log(jsonForforecast); |
| 209 | request.post( | 371 | request.post( |
| 210 | { | 372 | { |
| ... | @@ -217,31 +379,198 @@ function findroad(eventObj){ | ... | @@ -217,31 +379,198 @@ function findroad(eventObj){ |
| 217 | "messages":[ | 379 | "messages":[ |
| 218 | { | 380 | { |
| 219 | "type":"text", | 381 | "type":"text", |
| 220 | - "text":"교통예보를 시작합니다." | 382 | + "text":"서울발 버스 소요 시간은 다음과 같습니다." |
| 383 | + }, | ||
| 384 | + { | ||
| 385 | + "type":"text", | ||
| 386 | + "text":'서울발 대전행 : 대략 ' + jsonForforecast.list[0].csudj_bus + '소요 예상 , ' + '서울발 대구행 : 대략 ' + jsonForforecast.list[0].csudg_bus + '소요 예상' | ||
| 221 | }, | 387 | }, |
| 222 | { | 388 | { |
| 223 | "type":"text", | 389 | "type":"text", |
| 224 | - "text":jsonForforecast.list[0].sdate+ ', ' + jsonForforecast.list[0].stime + '기준입니다.' | 390 | + "text":'서울발 울산행 : 대략 ' + jsonForforecast.list[0].csuus_bus + '소요 예상' + '서울발 부산행 : 대략 ' + jsonForforecast.list[0].csubs_bus + '소요 예상' |
| 225 | }, | 391 | }, |
| 226 | { | 392 | { |
| 227 | "type":"text", | 393 | "type":"text", |
| 228 | - "text": '현재 전국 교통량은 ' + jsonForforecast.list[0].cjunkook + '대 이며, 지방방향 교통량은 ' + jsonForforecast.list[0].cjibangDir + '대, 서울방향 교통량은 ' + jsonForforecast.list[0].cseoulDir + '대입니다.' | 394 | + "text":'서울발 목포행 : 대략 ' + jsonForforecast.list[0].csump_bus + '소요 예상' + '서울발 광주행 : 대략 ' + jsonForforecast.list[0].csugj_bus + '소요 예상' |
| 229 | }, | 395 | }, |
| 230 | { | 396 | { |
| 231 | "type":"text", | 397 | "type":"text", |
| 232 | - "text":"버스기준으로 보시겠습니까 아니면 일반 승용차 기준으로 보시겠습니까? 버스기준으로 보실려면 1번을, 일반 승용차 기준으로 보실려면 2번을 입력해 주세요." | 398 | + "text":'서울발 강릉행 : 대략 ' + jsonForforecast.list[0].csukr_bus + '소요 예상' |
| 233 | } | 399 | } |
| 400 | + | ||
| 234 | ] | 401 | ] |
| 235 | } | 402 | } |
| 236 | },(error, response, body) => { | 403 | },(error, response, body) => { |
| 237 | console.log(body) | 404 | console.log(body) |
| 238 | }); | 405 | }); |
| 406 | + | ||
| 239 | }); | 407 | }); |
| 240 | 408 | ||
| 241 | } | 409 | } |
| 242 | 410 | ||
| 243 | 411 | ||
| 244 | 412 | ||
| 413 | +function busforecasttoG(eventObj){ | ||
| 414 | + | ||
| 415 | + | ||
| 416 | + | ||
| 417 | + jsonforecast(function(object){ | ||
| 418 | + var obj = object; | ||
| 419 | + var jsonForforecast = obj; | ||
| 420 | + request.post( | ||
| 421 | + { | ||
| 422 | + url: TARGET_URL, | ||
| 423 | + headers: { | ||
| 424 | + 'Authorization': `Bearer ${TOKEN}` | ||
| 425 | + }, | ||
| 426 | + json: { | ||
| 427 | + "replyToken":eventObj.replyToken, | ||
| 428 | + "messages":[ | ||
| 429 | + { | ||
| 430 | + "type":"text", | ||
| 431 | + "text":"지방발 버스 소요 시간은 다음과 같습니다." | ||
| 432 | + }, | ||
| 433 | + { | ||
| 434 | + "type":"text", | ||
| 435 | + "text":"대전발 서울행 : 대략 " + jsonForforecast.list[0].cdjsu_bus + "소요 예상" | ||
| 436 | + }, | ||
| 437 | + { | ||
| 438 | + "type":"text", | ||
| 439 | + "text":"대구발 서울행 : 대략 " + jsonForforecast.list[0].cdgsu_bus + "소요 예상" | ||
| 440 | + }, | ||
| 441 | + { | ||
| 442 | + "type":"text", | ||
| 443 | + "text":"울산발 서울행 : 대략 " + jsonForforecast.list[0].cussu_bus + "소요 예상" | ||
| 444 | + }, | ||
| 445 | + { | ||
| 446 | + "type":"text", | ||
| 447 | + "text":"부산발 서울행 : 대략 " + jsonForforecast.list[0].cbssu_bus + "소요 예상" | ||
| 448 | + }, | ||
| 449 | + { | ||
| 450 | + "type":"text", | ||
| 451 | + "text":"목포발 서울행 : 대략 " + jsonForforecast.list[0].cmpsu_bus + "소요 예상" | ||
| 452 | + }, | ||
| 453 | + { | ||
| 454 | + "type":"text", | ||
| 455 | + "text":"광주발 서울행 : 대략 " + jsonForforecast.list[0].cgjsu_bus + "소요 예상" | ||
| 456 | + }, | ||
| 457 | + { | ||
| 458 | + "type":"text", | ||
| 459 | + "text":"강릉발 서울행 : 대략 " + jsonForforecast.list[0].ckrsu_bus + "소요 예상" | ||
| 460 | + } | ||
| 461 | + | ||
| 462 | + ] | ||
| 463 | + } | ||
| 464 | + },(error, response, body) => { | ||
| 465 | + console.log(body) | ||
| 466 | + }); | ||
| 467 | + | ||
| 468 | + }); | ||
| 469 | + | ||
| 470 | +} | ||
| 471 | + | ||
| 472 | +function normalforecasttoS(eventObj, json){ | ||
| 473 | + request.post( | ||
| 474 | + { | ||
| 475 | + url: TARGET_URL, | ||
| 476 | + headers: { | ||
| 477 | + 'Authorization': `Bearer ${TOKEN}` | ||
| 478 | + }, | ||
| 479 | + json: { | ||
| 480 | + "replyToken":eventObj.replyToken, | ||
| 481 | + "messages":[ | ||
| 482 | + { | ||
| 483 | + "type":"text", | ||
| 484 | + "text":"서울발 일반 자가용 소요 시간은 다음과 같습니다." | ||
| 485 | + }, | ||
| 486 | + { | ||
| 487 | + "type":"text", | ||
| 488 | + "text":"서울발 대전행 : 대략 " + json.list[0].csudj + "소요 예상" | ||
| 489 | + }, | ||
| 490 | + { | ||
| 491 | + "type":"text", | ||
| 492 | + "text":"서울발 대구행 : 대략 " + json.list[0].csudg+ "소요 예상" | ||
| 493 | + }, | ||
| 494 | + { | ||
| 495 | + "type":"text", | ||
| 496 | + "text":"서울발 울산행 : 대략 " + json.list[0].csuus + "소요 예상" | ||
| 497 | + }, | ||
| 498 | + { | ||
| 499 | + "type":"text", | ||
| 500 | + "text":"서울발 부산행 : 대략 " + json.list[0].csubs + "소요 예상" | ||
| 501 | + }, | ||
| 502 | + { | ||
| 503 | + "type":"text", | ||
| 504 | + "text":"서울발 목포행 : 대략 " + json.list[0].csump+ "소요 예상" | ||
| 505 | + }, | ||
| 506 | + { | ||
| 507 | + "type":"text", | ||
| 508 | + "text":"서울발 광주행 : 대략 " + json.list[0].csugj + "소요 예상" | ||
| 509 | + }, | ||
| 510 | + { | ||
| 511 | + "type":"text", | ||
| 512 | + "text":"서울발 강릉행 : 대략 " + json.list[0].csukr + "소요 예상" | ||
| 513 | + } | ||
| 514 | + | ||
| 515 | + ] | ||
| 516 | + } | ||
| 517 | + },(error, response, body) => { | ||
| 518 | + console.log(body) | ||
| 519 | + }); | ||
| 520 | +} | ||
| 521 | + | ||
| 522 | + | ||
| 523 | + | ||
| 524 | + | ||
| 525 | +function normalforecasttoG(eventObj, json){ | ||
| 526 | + request.post( | ||
| 527 | + { | ||
| 528 | + url: TARGET_URL, | ||
| 529 | + headers: { | ||
| 530 | + 'Authorization': `Bearer ${TOKEN}` | ||
| 531 | + }, | ||
| 532 | + json: { | ||
| 533 | + "replyToken":eventObj.replyToken, | ||
| 534 | + "messages":[ | ||
| 535 | + { | ||
| 536 | + "type":"text", | ||
| 537 | + "text":"지방발 일반 자가용 소요 시간은 다음과 같습니다." | ||
| 538 | + }, | ||
| 539 | + { | ||
| 540 | + "type":"text", | ||
| 541 | + "text":"대전발 서울행 : 대략 " + json.list[0].cdjsu + "소요 예상" | ||
| 542 | + }, | ||
| 543 | + { | ||
| 544 | + "type":"text", | ||
| 545 | + "text":"대구발 서울행 : 대략 " + json.list[0].cdgsu + "소요 예상" | ||
| 546 | + }, | ||
| 547 | + { | ||
| 548 | + "type":"text", | ||
| 549 | + "text":"울산발 서울행 : 대략 " + json.list[0].cussu + "소요 예상" | ||
| 550 | + }, | ||
| 551 | + { | ||
| 552 | + "type":"text", | ||
| 553 | + "text":"부산발 서울행 : 대략 " + json.list[0].cbssu + "소요 예상" | ||
| 554 | + }, | ||
| 555 | + { | ||
| 556 | + "type":"text", | ||
| 557 | + "text":"목포발 서울행 : 대략 " + json.list[0].cmpsu + "소요 예상" | ||
| 558 | + }, | ||
| 559 | + { | ||
| 560 | + "type":"text", | ||
| 561 | + "text":"광주발 서울행 : 대략 " + json.list[0].cgjsu + "소요 예상" | ||
| 562 | + }, | ||
| 563 | + { | ||
| 564 | + "type":"text", | ||
| 565 | + "text":"강릉발 서울행 : 대략 " + json.list[0].ckrsu + "소요 예상" | ||
| 566 | + } | ||
| 567 | + | ||
| 568 | + ] | ||
| 569 | + } | ||
| 570 | + },(error, response, body) => { | ||
| 571 | + console.log(body) | ||
| 572 | + }); | ||
| 573 | +} | ||
| 245 | 574 | ||
| 246 | 575 | ||
| 247 | // var url1 = 'http://data.ex.co.kr/openapi/odtraffic/trafficAmountByCongest'; | 576 | // var url1 = 'http://data.ex.co.kr/openapi/odtraffic/trafficAmountByCongest'; | ... | ... |
-
Please register or login to post a comment