44
55namespace InteractionDesignFoundation \GeoIP \Services ;
66
7- use Exception ;
87use Illuminate \Support \Arr ;
98use InteractionDesignFoundation \GeoIP \Support \HttpClient ;
109
@@ -99,32 +98,10 @@ public function locate($ip): \InteractionDesignFoundation\GeoIP\Location
9998
10099 /**
101100 * Update function for service.
102- * @throws \Exception
103101 */
104102 public function update (): string
105103 {
106- $ data = $ this ->client ->get ('https://dev.maxmind.com/static/csv/codes/country_continent.csv ' );
107-
108- // Verify server response
109- if ($ this ->client ->getErrors () !== null ) {
110- throw new Exception ($ this ->client ->getErrors ());
111- }
112-
113- $ lines = explode ("\n" , (string ) $ data [0 ]);
114-
115- array_shift ($ lines );
116-
117- $ output = [];
118-
119- foreach ($ lines as $ line ) {
120- $ arr = str_getcsv ((string ) $ line );
121-
122- if (count ($ arr ) < 2 ) {
123- continue ;
124- }
125-
126- $ output [$ arr [0 ]] = $ arr [1 ];
127- }
104+ $ output = self ::countryContinentMap ();
128105
129106 // Get path
130107 $ path = $ this ->config ('continent_path ' );
@@ -134,6 +111,68 @@ public function update(): string
134111 return sprintf ('Continent file (%s) updated. ' , $ path );
135112 }
136113
114+ /**
115+ * ISO 3166 country code to continent code mapping.
116+ *
117+ * @return array<string, string>
118+ */
119+ private static function countryContinentMap (): array
120+ {
121+ return [
122+ 'AD ' => 'EU ' , 'AE ' => 'AS ' , 'AF ' => 'AS ' , 'AG ' => 'NA ' , 'AI ' => 'NA ' ,
123+ 'AL ' => 'EU ' , 'AM ' => 'AS ' , 'AO ' => 'AF ' , 'AP ' => 'AS ' , 'AQ ' => 'AN ' ,
124+ 'AR ' => 'SA ' , 'AS ' => 'OC ' , 'AT ' => 'EU ' , 'AU ' => 'OC ' , 'AW ' => 'NA ' ,
125+ 'AX ' => 'EU ' , 'AZ ' => 'AS ' , 'BA ' => 'EU ' , 'BB ' => 'NA ' , 'BD ' => 'AS ' ,
126+ 'BE ' => 'EU ' , 'BF ' => 'AF ' , 'BG ' => 'EU ' , 'BH ' => 'AS ' , 'BI ' => 'AF ' ,
127+ 'BJ ' => 'AF ' , 'BL ' => 'NA ' , 'BM ' => 'NA ' , 'BN ' => 'AS ' , 'BO ' => 'SA ' ,
128+ 'BQ ' => 'NA ' , 'BR ' => 'SA ' , 'BS ' => 'NA ' , 'BT ' => 'AS ' , 'BV ' => 'AN ' ,
129+ 'BW ' => 'AF ' , 'BY ' => 'EU ' , 'BZ ' => 'NA ' , 'CA ' => 'NA ' , 'CC ' => 'AS ' ,
130+ 'CD ' => 'AF ' , 'CF ' => 'AF ' , 'CG ' => 'AF ' , 'CH ' => 'EU ' , 'CI ' => 'AF ' ,
131+ 'CK ' => 'OC ' , 'CL ' => 'SA ' , 'CM ' => 'AF ' , 'CN ' => 'AS ' , 'CO ' => 'SA ' ,
132+ 'CR ' => 'NA ' , 'CU ' => 'NA ' , 'CV ' => 'AF ' , 'CW ' => 'NA ' , 'CX ' => 'AS ' ,
133+ 'CY ' => 'AS ' , 'CZ ' => 'EU ' , 'DE ' => 'EU ' , 'DJ ' => 'AF ' , 'DK ' => 'EU ' ,
134+ 'DM ' => 'NA ' , 'DO ' => 'NA ' , 'DZ ' => 'AF ' , 'EC ' => 'SA ' , 'EE ' => 'EU ' ,
135+ 'EG ' => 'AF ' , 'EH ' => 'AF ' , 'ER ' => 'AF ' , 'ES ' => 'EU ' , 'ET ' => 'AF ' ,
136+ 'EU ' => 'EU ' , 'FI ' => 'EU ' , 'FJ ' => 'OC ' , 'FK ' => 'SA ' , 'FM ' => 'OC ' ,
137+ 'FO ' => 'EU ' , 'FR ' => 'EU ' , 'GA ' => 'AF ' , 'GB ' => 'EU ' , 'GD ' => 'NA ' ,
138+ 'GE ' => 'AS ' , 'GF ' => 'SA ' , 'GG ' => 'EU ' , 'GH ' => 'AF ' , 'GI ' => 'EU ' ,
139+ 'GL ' => 'NA ' , 'GM ' => 'AF ' , 'GN ' => 'AF ' , 'GP ' => 'NA ' , 'GQ ' => 'AF ' ,
140+ 'GR ' => 'EU ' , 'GS ' => 'AN ' , 'GT ' => 'NA ' , 'GU ' => 'OC ' , 'GW ' => 'AF ' ,
141+ 'GY ' => 'SA ' , 'HK ' => 'AS ' , 'HM ' => 'AN ' , 'HN ' => 'NA ' , 'HR ' => 'EU ' ,
142+ 'HT ' => 'NA ' , 'HU ' => 'EU ' , 'ID ' => 'AS ' , 'IE ' => 'EU ' , 'IL ' => 'AS ' ,
143+ 'IM ' => 'EU ' , 'IN ' => 'AS ' , 'IO ' => 'AS ' , 'IQ ' => 'AS ' , 'IR ' => 'AS ' ,
144+ 'IS ' => 'EU ' , 'IT ' => 'EU ' , 'JE ' => 'EU ' , 'JM ' => 'NA ' , 'JO ' => 'AS ' ,
145+ 'JP ' => 'AS ' , 'KE ' => 'AF ' , 'KG ' => 'AS ' , 'KH ' => 'AS ' , 'KI ' => 'OC ' ,
146+ 'KM ' => 'AF ' , 'KN ' => 'NA ' , 'KP ' => 'AS ' , 'KR ' => 'AS ' , 'KW ' => 'AS ' ,
147+ 'KY ' => 'NA ' , 'KZ ' => 'AS ' , 'LA ' => 'AS ' , 'LB ' => 'AS ' , 'LC ' => 'NA ' ,
148+ 'LI ' => 'EU ' , 'LK ' => 'AS ' , 'LR ' => 'AF ' , 'LS ' => 'AF ' , 'LT ' => 'EU ' ,
149+ 'LU ' => 'EU ' , 'LV ' => 'EU ' , 'LY ' => 'AF ' , 'MA ' => 'AF ' , 'MC ' => 'EU ' ,
150+ 'MD ' => 'EU ' , 'ME ' => 'EU ' , 'MF ' => 'NA ' , 'MG ' => 'AF ' , 'MH ' => 'OC ' ,
151+ 'MK ' => 'EU ' , 'ML ' => 'AF ' , 'MM ' => 'AS ' , 'MN ' => 'AS ' , 'MO ' => 'AS ' ,
152+ 'MP ' => 'OC ' , 'MQ ' => 'NA ' , 'MR ' => 'AF ' , 'MS ' => 'NA ' , 'MT ' => 'EU ' ,
153+ 'MU ' => 'AF ' , 'MV ' => 'AS ' , 'MW ' => 'AF ' , 'MX ' => 'NA ' , 'MY ' => 'AS ' ,
154+ 'MZ ' => 'AF ' , 'NA ' => 'AF ' , 'NC ' => 'OC ' , 'NE ' => 'AF ' , 'NF ' => 'OC ' ,
155+ 'NG ' => 'AF ' , 'NI ' => 'NA ' , 'NL ' => 'EU ' , 'NO ' => 'EU ' , 'NP ' => 'AS ' ,
156+ 'NR ' => 'OC ' , 'NU ' => 'OC ' , 'NZ ' => 'OC ' , 'OM ' => 'AS ' , 'PA ' => 'NA ' ,
157+ 'PE ' => 'SA ' , 'PF ' => 'OC ' , 'PG ' => 'OC ' , 'PH ' => 'AS ' , 'PK ' => 'AS ' ,
158+ 'PL ' => 'EU ' , 'PM ' => 'NA ' , 'PN ' => 'OC ' , 'PR ' => 'NA ' , 'PS ' => 'AS ' ,
159+ 'PT ' => 'EU ' , 'PW ' => 'OC ' , 'PY ' => 'SA ' , 'QA ' => 'AS ' , 'RE ' => 'AF ' ,
160+ 'RO ' => 'EU ' , 'RS ' => 'EU ' , 'RU ' => 'EU ' , 'RW ' => 'AF ' , 'SA ' => 'AS ' ,
161+ 'SB ' => 'OC ' , 'SC ' => 'AF ' , 'SD ' => 'AF ' , 'SE ' => 'EU ' , 'SG ' => 'AS ' ,
162+ 'SH ' => 'AF ' , 'SI ' => 'EU ' , 'SJ ' => 'EU ' , 'SK ' => 'EU ' , 'SL ' => 'AF ' ,
163+ 'SM ' => 'EU ' , 'SN ' => 'AF ' , 'SO ' => 'AF ' , 'SR ' => 'SA ' , 'SS ' => 'AF ' ,
164+ 'ST ' => 'AF ' , 'SV ' => 'NA ' , 'SX ' => 'NA ' , 'SY ' => 'AS ' , 'SZ ' => 'AF ' ,
165+ 'TC ' => 'NA ' , 'TD ' => 'AF ' , 'TF ' => 'AN ' , 'TG ' => 'AF ' , 'TH ' => 'AS ' ,
166+ 'TJ ' => 'AS ' , 'TK ' => 'OC ' , 'TL ' => 'AS ' , 'TM ' => 'AS ' , 'TN ' => 'AF ' ,
167+ 'TO ' => 'OC ' , 'TR ' => 'EU ' , 'TT ' => 'NA ' , 'TV ' => 'OC ' , 'TW ' => 'AS ' ,
168+ 'TZ ' => 'AF ' , 'UA ' => 'EU ' , 'UG ' => 'AF ' , 'UM ' => 'OC ' , 'US ' => 'NA ' ,
169+ 'UY ' => 'SA ' , 'UZ ' => 'AS ' , 'VA ' => 'EU ' , 'VC ' => 'NA ' , 'VE ' => 'SA ' ,
170+ 'VG ' => 'NA ' , 'VI ' => 'NA ' , 'VN ' => 'AS ' , 'VU ' => 'OC ' , 'WF ' => 'OC ' ,
171+ 'WS ' => 'OC ' , 'XK ' => 'EU ' , 'YE ' => 'AS ' , 'YT ' => 'AF ' , 'ZA ' => 'AF ' ,
172+ 'ZM ' => 'AF ' , 'ZW ' => 'AF ' ,
173+ ];
174+ }
175+
137176 /** Get a continent based on country code. */
138177 private function getContinent (string $ code ): string
139178 {
0 commit comments