Skip to content

Commit

Permalink
Merge pull request #674 from ArtBlocks/studio
Browse files Browse the repository at this point in the history
✨ adding studio to artbot
  • Loading branch information
grantoesterling authored May 20, 2024
2 parents 6da03b8 + 16896ac commit 2a879a1
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 4 deletions.
3 changes: 3 additions & 0 deletions src/Classes/APIBots/ReservoirSaleBot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
ensOrAddress,
replaceVideoWithGIF,
getTokenUrl,
isStudioContract,
} from './utils'

type ReservoirSale = {
Expand Down Expand Up @@ -227,6 +228,8 @@ export class ReservoirSaleBot extends APIPollBot {
curationStatus = 'AB x Bright Moments'
} else if (isExplorationsContract(sale.token.contract)) {
curationStatus = 'Explorations'
} else if (isStudioContract(sale.token.contract)) {
curationStatus = 'Studio'
} else if (isEngineContract(sale.token.contract)) {
curationStatus = 'Engine'
if (artBlocksData?.platform) {
Expand Down
20 changes: 18 additions & 2 deletions src/Classes/APIBots/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
ARBITRUM_CONTRACTS,
COLLAB_CONTRACTS,
ENGINE_CONTRACTS,
STUDIO_CONTRACTS,
} from '../../index'
import { CollectionType } from '../MintBot'
import { AxiosError } from 'axios'
Expand Down Expand Up @@ -172,6 +173,10 @@ export function isExplorationsContract(contractAddress: string): boolean {
)
}

export function isStudioContract(contractAddress: string): boolean {
return STUDIO_CONTRACTS.includes(contractAddress.toLowerCase())
}

export function isEngineContract(contractAddress: string): boolean {
return ENGINE_CONTRACTS.includes(contractAddress.toLowerCase())
}
Expand Down Expand Up @@ -199,6 +204,8 @@ export async function getCollectionType(
return CollectionType.COLLAB
} else if (isEngineContract(contractAddress)) {
return CollectionType.ENGINE
} else if (isStudioContract(contractAddress)) {
return CollectionType.STUDIO
}

throw new Error('Unknown collection type')
Expand All @@ -216,11 +223,12 @@ export function getTokenUrl(
}

export function getProjectUrl(contractAddr: string, projectId: string): string {
return `https://www.artblocks.io/project/${contractAddr}-${projectId}`
// TODO: support new curated pages when ready
return `https://www.artblocks.io/marketplace/collections/${contractAddr}-${projectId}`
}

function buildArtBlocksTokenURL(contractAddr: string, tokenId: string): string {
return `https://www.artblocks.io/token/${contractAddr}-${tokenId}`
return `https://www.artblocks.io/marketplace/asset/${contractAddr}/${tokenId}`
}

export function buildOpenseaURL(contractAddr: string, tokenId: string): string {
Expand Down Expand Up @@ -270,6 +278,14 @@ export async function replaceVideoWithGIF(url: string) {
}

export const delay = (ms: number) => new Promise((res) => setTimeout(res, ms))
export const waitForStudioContracts = async (): Promise<string[]> => {
while (STUDIO_CONTRACTS.length === 0) {
console.log('Waiting for studio contracts to load...')
await delay(4000)
}
console.log('studio contracts loaded')
return STUDIO_CONTRACTS
}
export const waitForEngineContracts = async (): Promise<string[]> => {
while (ENGINE_CONTRACTS.length === 0) {
console.log('Waiting for engine contracts to load...')
Expand Down
6 changes: 6 additions & 0 deletions src/Classes/MintBot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
getTokenUrl,
replaceVideoWithGIF,
waitForEngineContracts,
waitForStudioContracts,
} from './APIBots/utils'
import { ensOrAddress } from './APIBots/utils'
import { TwitterBot } from './TwitterBot'
Expand All @@ -29,6 +30,7 @@ export enum CollectionType {
COLLAB = 'COLLAB',
ENGINE = 'ENGINE',
STAGING = 'STAGING',
STUDIO = 'STUDIO',
}

// Handles all logic and posting of new project mints!
Expand Down Expand Up @@ -77,6 +79,7 @@ export class MintBot {
async buildContractToChannel() {
const contractToChannel: { [id: string]: string[] } = {}
const engineContracts = await waitForEngineContracts()
const studioContracts = await waitForStudioContracts()
Object.entries(MINT_CONFIG).forEach(([mintType, channels]) => {
let contracts: string[] = []
switch (mintType) {
Expand All @@ -92,6 +95,9 @@ export class MintBot {
case CollectionType.ENGINE:
contracts = engineContracts ?? []
break
case CollectionType.STUDIO:
contracts = studioContracts ?? []
break
case CollectionType.STAGING:
contracts = Object.values(STAGING_CONTRACTS)
break
Expand Down
6 changes: 6 additions & 0 deletions src/Data/graphql/artbot-hasura-queries.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -236,3 +236,9 @@ query GetProjectRandomOOB($project_id: String!, $seed: float8!) {
}
}
}

query GetStudioContracts {
contracts_metadata(where: { default_vertical: { name: { _eq: studio } } }) {
...ContractDetail
}
}
27 changes: 26 additions & 1 deletion src/Data/queryGraphQL.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,12 @@ import {
UpcomingProjectDetailFragment,
GetProjectRandomOobDocument,
OobTokenDetailFragment,
GetStudioContractsDocument,
} from '../../generated/graphql'
import { isArbitrumContract } from '../Classes/APIBots/utils'
import {
isArbitrumContract,
waitForStudioContracts,
} from '../Classes/APIBots/utils'
import { ARBITRUM_CONTRACTS, ENGINE_CONTRACTS } from '..'

dotenv.config()
Expand Down Expand Up @@ -137,11 +141,32 @@ export async function getArbitrumContracts() {
}
}

export async function getStudioContracts() {
try {
const { data } = await client
.query(GetStudioContractsDocument, {})
.toPromise()

if (!data) {
throw Error('No data returned from getStudioContracts Hasura query')
}

const allContracts = data.contracts_metadata.map(({ address }) => address)

return allContracts
} catch (err) {
console.error(err)
return undefined
}
}

export async function getEngineContracts() {
const studioContracts = await waitForStudioContracts()
const nonPBABContracts: string[] = Object.values(CORE_CONTRACTS)
.concat(Object.values(COLLAB_CONTRACTS))
.concat(Object.values(EXPLORATION_CONTRACTS))
.concat(Object.values(BLOCKED_ENGINE_CONTRACTS))
.concat(studioContracts ?? [])
try {
const { data } = await client
.query(GetEngineContractsDocument, {
Expand Down
2 changes: 2 additions & 0 deletions src/Utils/activityTriager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ export function sendEmbedToSaleChannels(
break
case CollectionType.COLLAB:
case CollectionType.CORE:
case CollectionType.STUDIO:
sendEmbedToChannel(bot, embed, CHANNEL_SALES)
sendEmbedToChannel(bot, embed, CHANNEL_SALES_CHAT)
break
Expand Down Expand Up @@ -218,6 +219,7 @@ export function sendEmbedToListChannels(
break
case CollectionType.COLLAB:
case CollectionType.CORE:
case CollectionType.STUDIO:
sendEmbedToChannel(bot, embed, CHANNEL_LISTINGS)
break
default:
Expand Down
12 changes: 11 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Client, Events, GatewayIntentBits } from 'discord.js'
const express = require('express')
const bodyParser = require('body-parser')
import { ProjectConfig } from './ProjectConfig/projectConfig'
export let STUDIO_CONTRACTS: string[] = []
export let ENGINE_CONTRACTS: string[] = []
export let ARBITRUM_CONTRACTS: string[] = []
export const projectConfig = new ProjectConfig()
Expand All @@ -18,9 +19,13 @@ import {
getArtBlocksXPaceProjects,
getEngineContracts,
getEngineProjects,
getStudioContracts,
} from './Data/queryGraphQL'
import { TriviaBot } from './Classes/TriviaBot'
import { waitForEngineContracts } from './Classes/APIBots/utils'
import {
waitForEngineContracts,
waitForStudioContracts,
} from './Classes/APIBots/utils'
import { ScheduleBot } from './Classes/SchedulerBot'
import { verifyTwitter } from './Utils/twitterUtils'

Expand All @@ -39,6 +44,9 @@ export const EXPLORATIONS_CONTRACTS: {
export const COLLAB_CONTRACTS: {
[id: string]: string
} = require('./ProjectConfig/collaborationContracts.json')
getStudioContracts().then((contracts) => {
STUDIO_CONTRACTS = contracts ?? []
})
getEngineContracts().then((contracts) => {
ENGINE_CONTRACTS = contracts ?? []
})
Expand Down Expand Up @@ -232,6 +240,7 @@ bot.on(Events.MessageCreate, async (msg) => {
})

const initReservoirBots = async () => {
const studioContracts = await waitForStudioContracts()
const engineContracts = await waitForEngineContracts()

const buildContractsString = (contracts: string[]): string => {
Expand Down Expand Up @@ -268,6 +277,7 @@ const initReservoirBots = async () => {
const allContracts = Object.values(CORE_CONTRACTS)
.concat(Object.values(COLLAB_CONTRACTS))
.concat(Object.values(EXPLORATIONS_CONTRACTS))
.concat(studioContracts ?? [])
.concat(engineContracts ?? [])

const RESERVOIR_CONTRACT_LIMIT = 20
Expand Down

0 comments on commit 2a879a1

Please sign in to comment.