// // Downloader.swift // TournamentStats // // Created by Laurent Morvillier on 02/10/2021. // Copyright © 2021 Stax River. All rights reserved. // import Foundation import RealmSwift class Downloader { struct TS { var id: String var date: String } static func downloadWSOPResults() { let ids = [ "21666", // 1 "21667", // 2 "21670", // 5 "21671", // 6 "21669", // 4 "21672", // 7 "21673", // 8 "21674", // 9 "21668", // 3 "21675", // 10 "21676", // 11 "21677", // 12 "21678", // 13 "21679", // 14 "21680", // 15 "21681", // 16 "21682", // 17 "21684", // 19 "21685", // 20 "21686", // 21 "21687", // 22 "21688", // 23 "21689", // 24 "21690", // 25 "21691", // 26 "21692", // 27 "21693", // 28 "21694", // 29 "21695", // 30 "21696", // 31 "21697", // 32 ] for id in ids { sleep(1) downloadWSOPResults(id: id) } } fileprivate static func downloadWSOPResults(id: String) { print("Importing tournament \(id)") guard let url = URL(string: "https://www.wsop.com/tournaments/results/?aid=2&grid=4943&tid=\(id)&rr=5") else { return } let realm = try! Realm() do { try realm.write { self.downloadWSOPResults(realm: realm, url: url) } } catch { print("error = \(error)") } } fileprivate static func downloadWSOPResults(realm: Realm, url: URL, currentTournament: Tournament? = nil) { let nf = NumberFormatter() nf.numberStyle = .decimal nf.locale = Locale.init(identifier: "en_US") nf.groupingSeparator = "," do { let string = try String(contentsOf: url) let infos = string.slice(from: "
", to: "
") ?? string.slice(from: "
", to: "eventinfo-progress") ?? string.slice(from: "
", to: "eventstats") if let infos = infos { var tournament: Tournament? = currentTournament if tournament == nil { let tour = realm.create(Tournament.self) tournament = tour //

Sunday, July 17, 2022 to Sunday, July 17, 2022

if let name = infos.slice(from: "

", to: "

") { tour.name = name let fullDatesString = infos.slice(from: "

", to: "

") let fullDates = fullDatesString?.components(separatedBy: " to ") if let endString = fullDates?.last, let end = Formatter.longDate.date(from: endString) { tour.date = end } else { print("Using now for date") tour.date = Date() } if let strNumber = name.slice(from: "Event #", to: ":"), let number = nf.number(from: strNumber) { tour.number = number.intValue } print("#\(tour.number) \(name)") if name.contains("6-Handed") { tour.tableSize = 6 } else if name.contains("7-Handed") { tour.tableSize = 7 } else if name.contains("8-Handed") { tour.tableSize = 8 } else if name.contains("Heads-Up") || name.contains("Heads Up") { tour.tableSize = 2 } } else { print("no name = \(infos)") } if let stats = string.slice(from: "
    ", to: "
    ") { if let strBuyin = stats.slice(from: "Buy-in: $", to: ""), let buyin = nf.number(from: strBuyin) { tour.buyin = buyin.intValue } else { print("no buyin = \(stats)") } if let strprizepool = stats.slice(from: "Prizepool: $", to: " "), let pp = nf.number(from: strprizepool) { tour.prizepool = pp.doubleValue } else { print("no prizepool = \(stats)") } if let strentries = stats.slice(from: "Entries: ", to: " "), let entries = nf.number(from: strentries) { tour.entries = entries.intValue } else { print("no entries = \(stats)") } } } if let strresultsblock = string.slice(from: "Country", to: "
    ").last { name = nameraw.replacingOccurrences(of: "", with: "") } if let earningsraw = cells[2].components(separatedBy: "$").last { let strearnings = earningsraw.replacingOccurrences(of: "", with: "") earnings = nf.number(from: strearnings)?.doubleValue } if hasPOY, let poyraw = cells[3].components(separatedBy: "\'>").last { let strpoy = poyraw.replacingOccurrences(of: "", with: "") poy = nf.number(from: strpoy)?.doubleValue } let cityIndex = hasPOY ? 4 : 3 if let cityraw = cells[cityIndex].components(separatedBy: "\'>").last { city = cityraw.replacingOccurrences(of: "", with: "") } let stateIndex = hasPOY ? 5 : 4 if let stateraw = cells[stateIndex].components(separatedBy: "\'>").last { state = stateraw.replacingOccurrences(of: "", with: "") } let countryIndex = hasPOY ? 6 : 5 if let countryraw = cells[countryIndex].components(separatedBy: "\'>").last { country = String(countryraw.prefix(2)) } guard let rank = rank, let name = name, let earnings = earnings else { print("Missing data: R: \(String(describing: rank)), N: \(name), E: \(earnings)") continue } let player = realm.getOrCreatePlayer(name: name, city: city ?? "", state: state ?? "", country: country ?? "") let result = realm.create(Result.self) result.player = player result.earnings = earnings result.rank = rank tournament?.results.append(result) } if currentTournament == nil, let paging = string.slice(from: "
    ") { let pages = paging.components(separatedBy: "