root/dev/mods/value_fetch/fetcher.php

Revision 486, 6.3 KB (checked in by kovell, 10 years ago)

Fixes: Default value_fetch modified to use CTL's pricing xml.

Line 
1<?php
2Class Fetcher
3{
4        var $faction;
5        var $xml_parser;
6        var $xml_file;
7        var $insideitem;
8        var $avg_sell;
9        var $avg_buy;
10        var $typeid;
11        var $count;
12        var $timestamp;
13        var $tooLow;
14        var $sell_median;
15        var $buy_median;
16        var $factionPrice;
17        // download the items.xml.gzphp and items.xml files from http://www.ekchu.com/dev/
18        // upload them to a directory on your own webspace
19        // modify the two paths below to point to the downloaded files
20        var $compfile = "http://www.ekchu.com/dev/items.xml.gzphp";
21        var $uncompfile = "http://www.ekchu.com/dev/items.xml";
22
23        function updateShips()
24        {
25                $qry = new DBQuery();
26                $qryins = new DBQuery();
27                $str = "SELECT ship.shp_id as id, item.price as price FROM kb3_ships ship JOIN kb3_item_price item ON item.typeID = ship.shp_externalid WHERE item.price > 0";
28                $i = 0;
29                $qry->execute($str);
30                while ($row = $qry->getRow())
31                {
32                        if($i) $querytext .=",";
33                        else $querytext="INSERT INTO kb3_ships_values (shp_id, shp_value) VALUES ";
34                        $querytext .= "('".$row['id']."','".$row['price']."')";
35                        $i++;
36                }
37                $querytext .= " ON DUPLICATE KEY UPDATE shp_value = VALUES(shp_value);";
38                $qry->execute($querytext);
39                return $i;
40        }
41
42        // Some of this work is based of the value_editor from Eve-dev killboard
43        function fetch_values_php5($factionin)
44        {
45                $this->faction = $factionin;
46                // Fetch the gzip file.
47                // Switch fopen to cURL if it exists
48                if (function_exists('curl_init'))
49                {
50                        $ch = curl_init();
51                        curl_setopt($ch, CURLOPT_URL, $this->compfile);
52                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
53                        curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
54                        $content = curl_exec($ch);
55                        curl_close($ch);
56                        if(strlen($content)==0) return 0;
57                }
58                else
59                {
60                        $file = fopen($this->compfile , "r");
61
62                        if (! $file) {
63                                return 0;
64                        }
65                        $content = stream_get_contents($file);
66                        fclose($file);
67                }
68                $content = gzinflate($content);
69                // Old style, direct, no gzip!
70                // $sxe = simplexml_load_file("http://svn.nsbit.dk/itemfetch/items.xml");
71                $sxe = new SimpleXMLElement($content);
72                // prepare counter
73                $i = 0;
74                // New query
75                $qry = new DBQuery();
76
77                foreach($sxe->market_stat as $stat)
78                {
79                // If there is almost nothing for sale, AT ALL, don't include!
80                // if ($stat->total_sell_volume < 5) continue;
81                // Same average as used in value_editor (eve_central_sync)
82                //$weighted_average = round(((1.6 * $stat->avg_buy_price + 0.8 * $stat->avg_sell_price) / 2),0);
83                // Use global sell prices
84                //$weighted_average = round($stat->avg_sell_price,0);
85                // Use sell median
86                        if (($stat->sell_median != null) && ($stat->sell_median != 0))
87                                $weighted_average = round($stat->sell_median,0);
88                        else
89                                $weighted_average = round($stat->avg_sell_price,0);
90
91                        if (($this->faction == true) && ($stat->factionPrice > 0))
92                                $weighted_average = round($stat->factionPrice,0);
93                        //                      if (!$weighted_average) continue;
94                        // Insert new values into the database and update the old
95                        // For the first item start the query. For later items add ','
96                        if($i) $querytext .=",";
97                        else $querytext="INSERT INTO kb3_item_price (typeID, price) VALUES ";
98                        $querytext .= "(".$stat->typeid.",".number_format($weighted_average, 0, '', '').")";
99                        $i++;
100                }
101                // Finish query with a check for duplicates. If so, just update
102                $querytext .= " ON DUPLICATE KEY UPDATE price = VALUES(price);";
103                $qry->execute($querytext);
104                return "Count: ".$i." <br><br>Cached on: ".date('H:i:s - j/m/Y',(int)($sxe->timestamp));
105        }
106
107        function fetch_values_php4($factionin)
108        {
109                $this->faction = $factionin;
110                $this->sell_median = null;
111                $this->buy_median = null;
112                $this->xml_parser = xml_parser_create();
113                xml_set_object($this->xml_parser, $this);
114                // use case-folding so we are sure to find the tag in $map_array
115                //xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, true);
116                xml_set_element_handler($this->xml_parser, "startElement", "endElement");
117                xml_set_character_data_handler($this->xml_parser, "characterData");
118
119                if (!($fp = fopen($this->uncompfile, "r"))) {
120                        die("could not open XML input");
121                }
122
123                while ($data = fread($fp, 4096))
124                {
125                        if (!xml_parse($this->xml_parser, $data, feof($fp)))
126                        {
127                                die(sprintf("XML error: %s at line %d",
128                                        xml_error_string(xml_get_error_code($this->xml_parser)), xml_get_current_line_number($this->xml_parser)));
129                        }
130                }
131                return "Count: ".$this->count." <br><br>Cached on: ".date('H:i:s - j/m/Y',$this->timestamp);
132        }
133
134
135        function characterData($parser, $data)
136        {
137                switch($this->tag)
138                {
139                        case "timestamp":
140                                $this->timestamp .= $data;
141                                break;
142                        case "total_sell_volume":
143                                $this->tooLow .= $data;
144                                break;
145                        case "typeid":
146                                $this->typeid .= $data;
147                                break;
148                        case "avg_buy_price":
149                                $this->avg_buy .= $data;
150                                break;
151                        case "avg_sell_price":
152                                $this->avg_sell .= $data;
153                                break;
154                        case "buy_median":
155                                $this->buy_median .= $data;
156                                break;
157                        case "sell_median":
158                                $this->sell_median .= $data;
159                                break;
160                        case "factionprice":
161                                $this->factionPrice .= $data;
162                                break;
163                }
164        }
165
166
167        function startElement($parser, $name, $attrs)
168        {
169                if ($this->insideitem)
170                {
171                        $this->tag = strtolower($name);
172                }
173                elseif (strtolower($name) == "timestamp")
174                {
175                        $this->tag = strtolower($name);
176                }
177                elseif (strtolower($name) == "market_stat")
178                {
179                        $this->insideitem = true;
180                }
181        }
182
183        function endElement($parser, $name)
184        {
185                if ($this->insideitem && (strtolower($name) == "market_stat"))
186                {
187                        if (true)//($this->tooLow > 4)
188                        {
189                                $qry = new DBQuery();
190                                // Old average calculation
191                                //$weighted_average = round(((1.6 * $this->avg_buy + 0.8 * $this->avg_sell) / 2),0);
192                                // New average using sell only
193                                //$weighted_average = round($this->avg_sell_price,0);
194                                // Median prices, if exists
195                                if (($this->sell_median != null) && ($this->sell_median != 0))
196                                        $weighted_average = round($this->sell_median,0);
197                                else
198                                        $weighted_average = round($this->avg_sell,0);
199                                if (($this->faction == true) && ($this->factionPrice != null))
200                                {
201                                        $weighted_average = round($this->factionPrice,0);
202                                }
203                                $qry->execute("REPLACE INTO kb3_item_price (typeID, price) VALUES ('".$this->typeid."','".number_format($weighted_average, 0, '', '')."')");
204                                $this->count++;
205                        }
206                        $this->insideitem = false;
207                        $this->typeid = null;
208                        $this->avg_buy = null;
209                        $this->avg_sell = null;
210                        $this->tooLow = null;
211                        $this->buy_median = null;
212                        $this->sell_median = null;
213                        $this->factionPrice = null;
214                }
215        }
216
217        function destroy()
218        {
219                xml_parser_free($this->xml_parser);
220        }
221}
Note: See TracBrowser for help on using the browser.