Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calculate rewards weighted by hours spent #23

Merged
merged 5 commits into from
Feb 7, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ops-guild/rewards/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
16 changes: 14 additions & 2 deletions ops-guild/rewards/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
# Coordinape Rewards - ⚙️ Ops Guild
# Contributor Rewards - ⚙️ Ops Guild

...
## Generate CSVs

Generate weekly rewards CSV files:

```
cd ops-guild/rewards/
npm install
node generate-weekly-csvs.js
```

## Weekly Rewards

See [`weekly/`](weekly/)
131 changes: 131 additions & 0 deletions ops-guild/rewards/generate-weekly-csvs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
const fs = require('fs')
const Papa = require('papaparse')
const { stringify } = require('csv-stringify');

generate()

async function generate() {
console.log('generate')

// Load the Coordinape contributions
const contributionsFilePath = `../contributions/coordinape-contributions.csv`
console.debug('contributionsFilePath:', contributionsFilePath)
let contributionsData = []
if (!fs.existsSync(contributionsFilePath)) {
console.error('File does not exist')
return
} else {
contributionsData = await loadCSVData(contributionsFilePath)
}
// console.debug('contributionsData:', contributionsData)

// Iterate every week from the week of [Sun May-29-2022 → Sun Jun-05-2022] until now
const weekEndDate = new Date('2022-06-05T00:00:00Z')
console.debug('weekEndDate:', weekEndDate)
const nowDate = new Date()
console.debug('nowDate:', nowDate)
while (nowDate.getTime() > weekEndDate.getTime()) {
const weekBeginDate = new Date(weekEndDate.getTime() - 7*24*60*60*1000)
console.info('week:', `[${weekBeginDate.toISOString()} → ${weekEndDate.toISOString()}]`)

// Extract this week's contributions
let contributionsDataThisWeek = []
contributionsData.forEach((dataRow) => {
const updatedAt = dataRow.updated_at
// console.debug('updatedAt:', updatedAt)
if (updatedAt != undefined) {
const updatedAtDate = new Date(updatedAt)
// console.debug('updatedAtDate:', updatedAtDate)
if (updatedAtDate.getTime() >= weekBeginDate.getTime()
&& updatedAtDate.getTime() < weekEndDate.getTime()
) {
console.debug('updatedAtDate:', updatedAtDate)
contributionsDataThisWeek.push(dataRow)
}
}
})
console.debug('contributionsDataThisWeek:', contributionsDataThisWeek)

// Summarize hours spent for each citizen
let rewards = {}
contributionsDataThisWeek.forEach((dataRow) => {
if (rewards[String(dataRow.passport_id)] == undefined) {
const reward = {
passport_id: Number(dataRow.passport_id),
profile_id: Number(dataRow.profile_id),
hours_spent_total: Number(dataRow.hours_spent)
}
rewards[String(dataRow.passport_id)] = reward
} else {
const reward = rewards[String(dataRow.passport_id)]
reward.hours_spent_total += Number(dataRow.hours_spent)
reward.hours_spent_total = Number(Number(reward.hours_spent_total).toFixed(2))
rewards[String(dataRow.passport_id)] = reward
}
})
console.debug('rewards:', rewards)

// Calculate hours spent by all citizens combined
let hoursSpentAllCitizens = 0
Object.keys(rewards).forEach((passportID) => {
console.debug('passportID:', passportID)
hoursSpentAllCitizens += rewards[passportID].hours_spent_total
})
console.debug('hoursSpentAllCitizens:', hoursSpentAllCitizens)

// Calculate each citizen's reward percentage
Object.keys(rewards).forEach((passportID) => {
console.debug('passportID:', passportID)
const reward = rewards[passportID]
const rewardPercentage = 100 * reward.hours_spent_total / hoursSpentAllCitizens
reward.reward_percentage = Number(rewardPercentage.toFixed(2))
})

// Export to CSV
if (Object.keys(rewards).length) {
exportToCSV(weekEndDate, rewards)
}

// Increase week end date by 7 days
weekEndDate.setDate(weekEndDate.getDate() + 7)
}
}

async function loadCSVData(filePath) {
console.info('loadCSVData')

const dataFile = fs.readFileSync(filePath)
const csvData = dataFile.toString()
console.debug('csvData:\n', csvData)

return new Promise(resolve => {
Papa.parse(csvData, {
header: true,
complete: (results) => {
console.log('complete')
resolve(results.data)
}
})
})
}

function exportToCSV(weekEndDate, rewards) {
console.log('exportToCSV')

const filename = 'weekly/' + weekEndDate.toISOString().substring(0, 10) + '_rewards.csv'
const writeableStream = fs.createWriteStream(filename)
const columns = [
'passport_id',
'profile_id',
'hours_spent_total',
'reward_percentage'
];
const stringifier = stringify({ header: true, columns: columns })
for (const passportID in rewards) {
const reward = rewards[passportID]
console.debug('reward:', reward)
stringifier.write(reward)
}
stringifier.pipe(writeableStream)
console.log('Finished writing data to CSV:', filename)
}
27 changes: 27 additions & 0 deletions ops-guild/rewards/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions ops-guild/rewards/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "rewards",
"version": "1.0.0",
"description": "Contributor rewards",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Nation3 DAO",
"license": "GPL-3.0-or-later",
"dependencies": {
"csv-stringify": "^6.4.5",
"papaparse": "^5.4.1"
}
}
5 changes: 5 additions & 0 deletions ops-guild/rewards/weekly/2023-10-29_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,68.59,83.31
272,3780245,6.6,8.02
280,229591,6.64,8.07
282,3893302,0.5,0.61
3 changes: 3 additions & 0 deletions ops-guild/rewards/weekly/2023-11-05_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,0.5,60.24
280,229591,0.33,39.76
2 changes: 2 additions & 0 deletions ops-guild/rewards/weekly/2023-11-12_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,0.5,100
3 changes: 3 additions & 0 deletions ops-guild/rewards/weekly/2023-11-19_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,2,85.84
272,3780245,0.33,14.16
3 changes: 3 additions & 0 deletions ops-guild/rewards/weekly/2023-11-26_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,5.5,76.92
272,3780245,1.65,23.08
3 changes: 3 additions & 0 deletions ops-guild/rewards/weekly/2023-12-03_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,16.5,87.72
272,3780245,2.31,12.28
3 changes: 3 additions & 0 deletions ops-guild/rewards/weekly/2023-12-10_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,12.5,90.45
272,3780245,1.32,9.55
3 changes: 3 additions & 0 deletions ops-guild/rewards/weekly/2023-12-17_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,10.23,63.03
272,3780245,6,36.97
2 changes: 2 additions & 0 deletions ops-guild/rewards/weekly/2023-12-24_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,2.82,100
2 changes: 2 additions & 0 deletions ops-guild/rewards/weekly/2023-12-31_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,1.82,100
3 changes: 3 additions & 0 deletions ops-guild/rewards/weekly/2024-01-07_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,5.97,94.76
272,3780245,0.33,5.24
3 changes: 3 additions & 0 deletions ops-guild/rewards/weekly/2024-01-14_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,7.32,82.99
272,3780245,1.5,17.01
2 changes: 2 additions & 0 deletions ops-guild/rewards/weekly/2024-01-21_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,0.66,100
3 changes: 3 additions & 0 deletions ops-guild/rewards/weekly/2024-01-28_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,0.66,33.17
272,3780245,1.33,66.83
2 changes: 2 additions & 0 deletions ops-guild/rewards/weekly/2024-02-04_rewards.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
passport_id,profile_id,hours_spent_total,reward_percentage
233,77877,1.83,100