New commit; shouldn't produce history
This commit is contained in:
		
							parent
							
								
									f45e302208
								
							
						
					
					
						commit
						f69814d8e7
					
				|  | @ -1,6 +1,9 @@ | ||||||
| /* Imports */ | /* Imports */ | ||||||
| import fs from 'fs' | import fs from 'fs' | ||||||
| import readline from "readline" | import readline from "readline" | ||||||
|  | 
 | ||||||
|  | import {astralcodexten} from "./platforms/astralcodexten-fetch.js" | ||||||
|  | import {coupcast} from "./platforms/coupcast-fetch.js" | ||||||
| import {csetforetell} from "./platforms/csetforetell-fetch.js" | import {csetforetell} from "./platforms/csetforetell-fetch.js" | ||||||
| import {elicit} from "./platforms/elicit-fetch.js" | import {elicit} from "./platforms/elicit-fetch.js" | ||||||
| import {estimize} from "./platforms/estimize-fetch.js" | import {estimize} from "./platforms/estimize-fetch.js" | ||||||
|  | @ -16,17 +19,18 @@ import {predictit} from "./platforms/predictit-fetch.js" | ||||||
| import {omen} from "./platforms/omen-fetch.js" | import {omen} from "./platforms/omen-fetch.js" | ||||||
| import {smarkets} from "./platforms/smarkets-fetch.js" | import {smarkets} from "./platforms/smarkets-fetch.js" | ||||||
| import {williamhill} from "./platforms/williamhill-fetch.js" | import {williamhill} from "./platforms/williamhill-fetch.js" | ||||||
|  | 
 | ||||||
| import {mergeEverything} from "./utils/mergeEverything.js" | import {mergeEverything} from "./utils/mergeEverything.js" | ||||||
| import {addToHistory} from "./utils/addToHistory.js" | import {addToHistory} from "./utils/addToHistory.js" | ||||||
| import {rebuildNetlifySiteWithNewData} from "./utils/rebuildNetliftySiteWithNewData.js" | import {rebuildNetlifySiteWithNewData} from "./utils/rebuildNetliftySiteWithNewData.js" | ||||||
| import {doEverything, tryCatchTryAgain} from "./utils/doEverything.js" | import {doEverything, tryCatchTryAgain} from "./utils/doEverything.js" | ||||||
| 
 | 
 | ||||||
| /* Support functions */ | /* Support functions */ | ||||||
| let functions = [csetforetell, elicit, /* estimize, */ fantasyscotus,  foretold, goodjudgment, goodjudgmentopen, hypermind, ladbrokes, metaculus, polymarket, predictit, omen, smarkets, williamhill, mergeEverything, addToHistory, rebuildNetlifySiteWithNewData, doEverything] | let functions = [astralcodexten, coupcast, csetforetell, elicit, /* estimize, */ fantasyscotus,  foretold, goodjudgment, goodjudgmentopen, hypermind, ladbrokes, metaculus, polymarket, predictit, omen, smarkets, williamhill, mergeEverything, addToHistory, rebuildNetlifySiteWithNewData, doEverything] | ||||||
| let functionNames =  functions.map(fun => fun.name) | let functionNames =  functions.map(fun => fun.name) | ||||||
| 
 | 
 | ||||||
| let whattodoMessage = functionNames | let whattodoMessage = functionNames | ||||||
|     .slice(0,functionNames.length-2) |     .slice(0,functionNames.length-4) | ||||||
|     .map((functionName,i) => `[${i}]: Download predictions from ${functionName}`) |     .map((functionName,i) => `[${i}]: Download predictions from ${functionName}`) | ||||||
|     .join('\n') + |     .join('\n') + | ||||||
|   `\n[${functionNames.length-4}]: Merge jsons them into one big json (and push it to mongodb database)` +  |   `\n[${functionNames.length-4}]: Merge jsons them into one big json (and push it to mongodb database)` +  | ||||||
|  |  | ||||||
							
								
								
									
										100
									
								
								src/platforms/astralcodexten-fetch.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								src/platforms/astralcodexten-fetch.js
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,100 @@ | ||||||
|  | /* Imports */ | ||||||
|  | import fs from 'fs' | ||||||
|  | import axios from "axios" | ||||||
|  | import { calculateStars } from "../utils/stars.js" | ||||||
|  | import { upsert } from "../utils/mongo-wrapper.js" | ||||||
|  | 
 | ||||||
|  | /* Definitions */ | ||||||
|  | let graphQLendpoint = "https://api.foretold.io/graphql" | ||||||
|  | let ScottAlexanderPredictions = ["6eebf79b-4b6f-487b-a6a5-748d82524637"] | ||||||
|  | 
 | ||||||
|  | /* Support functions */ | ||||||
|  | async function fetchAllCommunityQuestions(communityId) { | ||||||
|  |   let response = await axios({ | ||||||
|  |     url: graphQLendpoint, | ||||||
|  |     method: 'POST', | ||||||
|  |     headers: ({ 'Content-Type': 'application/json' }), | ||||||
|  |     data: JSON.stringify(({ | ||||||
|  |       query: ` | ||||||
|  |       query { | ||||||
|  |         measurables( | ||||||
|  |           channelId: "${communityId}", | ||||||
|  |           states: OPEN, | ||||||
|  |           first: 500 | ||||||
|  |         ){ | ||||||
|  | 		      total | ||||||
|  |           edges{ | ||||||
|  |             node{ | ||||||
|  |               id | ||||||
|  |               name | ||||||
|  |               valueType | ||||||
|  |               measurementCount | ||||||
|  |               previousAggregate{ | ||||||
|  |                 value{ | ||||||
|  |                   percentage | ||||||
|  |                 } | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       ` | ||||||
|  |     })), | ||||||
|  |   }) | ||||||
|  |     .then(res => res.data) | ||||||
|  |     .then(res => res.data.measurables.edges) | ||||||
|  |   //console.log(response)
 | ||||||
|  |   return response | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Body */ | ||||||
|  | 
 | ||||||
|  | export async function astralcodexten(){ | ||||||
|  |   let results = [] | ||||||
|  |   for(let community of ScottAlexanderPredictions){ | ||||||
|  |     let questions = await fetchAllCommunityQuestions(community) | ||||||
|  |     questions = questions.map(question => question.node) | ||||||
|  |     questions = questions.filter(question => question.previousAggregate) // Questions without any predictions
 | ||||||
|  |     questions.forEach(question => { | ||||||
|  |       let options = [] | ||||||
|  |       if(question.valueType == "PERCENTAGE"){ | ||||||
|  |         let probability = question.previousAggregate.value.percentage | ||||||
|  |         options = [ | ||||||
|  |           { | ||||||
|  |             "name": "Yes", | ||||||
|  |             "probability": probability/100, | ||||||
|  |             "type": "PROBABILITY" | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             "name": "No", | ||||||
|  |             "probability": 1-probability/100, | ||||||
|  |             "type": "PROBABILITY" | ||||||
|  |           } | ||||||
|  |         ] | ||||||
|  |       } | ||||||
|  |       let result = { | ||||||
|  |           "title": question.name.split(". ")[1], | ||||||
|  |           "url": `https://www.foretold.io/c/${community}/m/${question.id}`, | ||||||
|  |           "platform": "AstralCodexTen", | ||||||
|  |           "description": "...by the end of 2021", | ||||||
|  |           "options": options, | ||||||
|  |           "timestamp": new Date().toISOString(), | ||||||
|  |           "qualityindicators": { | ||||||
|  |             "numforecasts": (question.measurementCount +1) / 2, | ||||||
|  |             "stars": calculateStars("AstralCodexTen", ({  })) | ||||||
|  |             } | ||||||
|  |           /*liquidity: liquidity.toFixed(2), | ||||||
|  |           tradevolume: tradevolume.toFixed(2), | ||||||
|  |           address: obj.address*/ | ||||||
|  |       } | ||||||
|  |       // console.log(result)
 | ||||||
|  |       results.push(result) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |   // let string = JSON.stringify(results, null, 2)
 | ||||||
|  |   // fs.writeFileSync('./data/foretold-questions.json', string);
 | ||||||
|  |   await upsert(results, "astralcodexten-questions") | ||||||
|  |   // console.log(results)
 | ||||||
|  |   console.log("Done") | ||||||
|  | } | ||||||
|  | // astralcodexten()
 | ||||||
							
								
								
									
										172
									
								
								src/platforms/coupcast-fetch.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								src/platforms/coupcast-fetch.js
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,172 @@ | ||||||
|  | /* Imports */ | ||||||
|  | import fs from "fs" | ||||||
|  | import axios from "axios" | ||||||
|  | import Papa from "papaparse" | ||||||
|  | import open from "open" | ||||||
|  | import readline from "readline" | ||||||
|  | import {calculateStars} from "../utils/stars.js" | ||||||
|  | import {upsert} from "../utils/mongo-wrapper.js" | ||||||
|  | 
 | ||||||
|  | /* Definitions */ | ||||||
|  | let coupCastEndpoint = "https://www.oneearthfuture.org/sites/all/themes/stability/stability_sub/data/dashboard_2021_code_02.csv" | ||||||
|  | var datenow = new Date(); | ||||||
|  | var currentmonth = datenow.getMonth() + 1;  | ||||||
|  | 
 | ||||||
|  | /* Support functions */ | ||||||
|  | let unique = arr => [...new Set(arr)] | ||||||
|  | let sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)); | ||||||
|  | 
 | ||||||
|  | let sanitizeCountryName = (country_name) => { | ||||||
|  |   let sanitized_name | ||||||
|  |   switch(country_name) { | ||||||
|  |     case "Cen African Rep": | ||||||
|  |       sanitized_name = "Central African Republic" | ||||||
|  |       break; | ||||||
|  |     case "Congo-Brz": | ||||||
|  |       sanitized_name = "Republic of the Congo" | ||||||
|  |       break; | ||||||
|  |     case "Congo/Zaire": | ||||||
|  |       sanitized_name = "Democratic Republic of the Congo" | ||||||
|  |       break; | ||||||
|  |     case "Czech Rep": | ||||||
|  |       sanitized_name = "Czech Republic" | ||||||
|  |       break; | ||||||
|  |     case "Dominican Rep": | ||||||
|  |       sanitized_name = "Dominican Republic" | ||||||
|  |       break; | ||||||
|  |     case "Korea North": | ||||||
|  |       sanitized_name = "North Korea" | ||||||
|  |       break; | ||||||
|  |     case "Korea South": | ||||||
|  |       sanitized_name = "South Korea" | ||||||
|  |       break; | ||||||
|  |     case "UKG": | ||||||
|  |       sanitized_name = "UK" | ||||||
|  |       break; | ||||||
|  |     default: | ||||||
|  |       sanitized_name = country_name | ||||||
|  |   } | ||||||
|  |   return sanitized_name | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | async function processArray(countryArray) { | ||||||
|  |   let results = [] | ||||||
|  |   for (let country of countryArray) { | ||||||
|  |     let url = `https://www.oneearthfuture.org/activities/coup-cast` | ||||||
|  | 
 | ||||||
|  |     // We don't really want the prediction for all months; one is enough
 | ||||||
|  |     // console.log(country.month)
 | ||||||
|  |     if(Number(country.month) == currentmonth){ | ||||||
|  |       // Monthly
 | ||||||
|  |       country.country_name = sanitizeCountryName(country.country_name) | ||||||
|  |       let processedPrediction1 = ({ | ||||||
|  |         "title": `Will there be a coup in ${country.country_name} in the next month (as of ${country.month}/${country.year})?`, | ||||||
|  |         "url": url, | ||||||
|  |         "platform": "CoupCast", | ||||||
|  |         "description": `. The current leader of ${country.country_name} is ${country.leader_name}, who has been in power for ${Number(country.leader_years).toFixed(1)} years.  ${country.country_name} has a ${(country.regime_type).toLowerCase()} regime type which has lasted for ${country.regime_years} years`, | ||||||
|  |         "options": [ | ||||||
|  |           { | ||||||
|  |             "name": "Yes", | ||||||
|  |             "probability": country.month_risk, | ||||||
|  |             "type": "PROBABILITY" | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             "name": "No", | ||||||
|  |             "probability": 1 - country.month_risk, | ||||||
|  |             "type": "PROBABILITY" | ||||||
|  |           } | ||||||
|  |         ], | ||||||
|  |         "timestamp": new Date().toISOString(), | ||||||
|  |         "qualityindicators": { | ||||||
|  |           "stars": calculateStars("Coupcast", ({})) | ||||||
|  |         }, | ||||||
|  |         "extra": { | ||||||
|  |           "country_name": country.country_name, | ||||||
|  |           "regime_type": country.regime_type, | ||||||
|  |           "month": country.month, | ||||||
|  |           "year": country.year, | ||||||
|  |           "leader_name": country.leader_name, | ||||||
|  |           "month_risk": country.month_risk, | ||||||
|  |           "annual_risk": country.annual_risk, | ||||||
|  |           "risk_change_percent": country.risk_change_percent, | ||||||
|  |           "regime_years": country.regime_years, | ||||||
|  |           "leader_years": country.leader_years, | ||||||
|  |           "country_code": country.country_code, | ||||||
|  |           "country_abb": country.country_abb | ||||||
|  |         } | ||||||
|  |       }) | ||||||
|  |        | ||||||
|  |       // Yearly
 | ||||||
|  |       let processedPrediction2 = ({ | ||||||
|  |         "title": `Will there be a coup in ${country.country_name} in the next year (as of ${country.month}/${country.year})?`, | ||||||
|  |         "url": url, | ||||||
|  |         "platform": "CoupCast", | ||||||
|  |         "description": `. The current leader of ${country.country_name} is ${country.leader_name}, who has been in power for ${Number(country.leader_years).toFixed(1)} years. ${country.country_name} has a ${(country.regime_type).toLowerCase()} regime type which has lasted for ${country.regime_years} years`, | ||||||
|  |         "options": [ | ||||||
|  |           { | ||||||
|  |             "name": "Yes", | ||||||
|  |             "probability": country.annual_risk, | ||||||
|  |             "type": "PROBABILITY" | ||||||
|  |           }, | ||||||
|  |           { | ||||||
|  |             "name": "No", | ||||||
|  |             "probability": 1 - country.annual_risk, | ||||||
|  |             "type": "PROBABILITY" | ||||||
|  |           } | ||||||
|  |         ], | ||||||
|  |         "timestamp": new Date().toISOString(), | ||||||
|  |         "qualityindicators": { | ||||||
|  |           "stars": calculateStars("CoupCast", ({})) | ||||||
|  |         }, | ||||||
|  |         "extra": { | ||||||
|  |           "country_name": country.country_name, | ||||||
|  |           "regime_type": country.regime_type, | ||||||
|  |           "month": country.month, | ||||||
|  |           "year": country.year, | ||||||
|  |           "leader_name": country.leader_name, | ||||||
|  |           "month_risk": country.month_risk, | ||||||
|  |           "annual_risk": country.annual_risk, | ||||||
|  |           "risk_change_percent": country.risk_change_percent, | ||||||
|  |           "regime_years": country.regime_years, | ||||||
|  |           "leader_years": country.leader_years, | ||||||
|  |           "country_code": country.country_code, | ||||||
|  |           "country_abb": country.country_abb | ||||||
|  |         } | ||||||
|  |       }) | ||||||
|  | 
 | ||||||
|  |       results.push(processedPrediction1) | ||||||
|  |       results.push(processedPrediction2) | ||||||
|  |       } | ||||||
|  |   } | ||||||
|  |   // let string = JSON.stringify(results, null, 2)
 | ||||||
|  |   // fs.writeFileSync('./data/elicit-questions.json', string);
 | ||||||
|  |   await upsert(results, "coupcast-questions") | ||||||
|  |   // console.log(results)
 | ||||||
|  |   console.log("Done") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Body */ | ||||||
|  | let filePath = "./data/coupcast-raw-download.csv" // not used right now.
 | ||||||
|  | 
 | ||||||
|  | export async function coupcast() { | ||||||
|  |   let csvContent = await axios.get(coupCastEndpoint) | ||||||
|  |     .then(query => query.data) | ||||||
|  |   await Papa.parse(csvContent, { | ||||||
|  |     header: true, | ||||||
|  |     complete: async (results) => { | ||||||
|  |       console.log('Downloaded', results.data.length, 'records.'); | ||||||
|  |       /* console.log( | ||||||
|  |         JSON.stringify( | ||||||
|  |           unique(results.data.map(country => country.country_name)), | ||||||
|  |           null,  | ||||||
|  |           4 | ||||||
|  |         ) | ||||||
|  |       )*/ | ||||||
|  |       // console.log(results.data)
 | ||||||
|  |       await processArray(results.data) | ||||||
|  |     } | ||||||
|  |   }); | ||||||
|  |   await sleep(1000) // needed to wait for Papaparse's callback to be executed. 
 | ||||||
|  | } | ||||||
|  | // coupcast()
 | ||||||
|  | @ -142,7 +142,7 @@ async function csetforetell_inner(cookie){ | ||||||
|       let h4elementSplit = h4element.split('"><span>') |       let h4elementSplit = h4element.split('"><span>') | ||||||
|       let url = h4elementSplit[0].split('<a href="')[1] |       let url = h4elementSplit[0].split('<a href="')[1] | ||||||
|       //console.log(url)
 |       //console.log(url)
 | ||||||
|       let title = h4elementSplit[1].replace('</span></a></h4>', "") |       let title = h4elementSplit[1].replace('</span></a></h4>', "").replace('</span></a></h5>', "") | ||||||
|       await sleep(1000 + Math.random()*1000) // don't be as noticeable
 |       await sleep(1000 + Math.random()*1000) // don't be as noticeable
 | ||||||
|       try{ |       try{ | ||||||
|         let moreinfo = await fetchStats(url, cookie) |         let moreinfo = await fetchStats(url, cookie) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user