import Masto from "mastodon"; import dotenv from "dotenv"; import fs from "node-fs"; import loadedHtml, {load} from "cheerio"; import $ from "cheerio"; let local_node_env_conf = dotenv.config() // console.log("conf", local_node_env_conf) export function randomIntFromInterval(min, max) { // min and max included return Math.floor(Math.random() * (max - min + 1) + min) | 1 } export function getRandomElementOfArray(listItems) { return listItems[Math.floor(Math.random() * listItems.length)] } let nowDate = new Date() export let defaultConfigMasto = { author: 'curator', visibility: 'public', language: 'fr', sensitive: false, reallySendPost: false, image: '', message: "Hey coucou! on est le" + nowDate, scheduled_at: "", content_type: "text/markdown" } export function tokenForAuthorIsPresentInDotEnv(author) { console.log(" process.env['TOKEN_' + author.toUpperCase()]", process.env['TOKEN_' + author.toUpperCase()]) return process.env['TOKEN_' + author.toUpperCase()]; } export default function sendPostMastodon(config){ // override defaults with input argument config = { ...defaultConfigMasto, ...config, } console.log("sendPostMastodon config", config) if (!config.reallySendPost) { console.log(" =========== le message ne sera PAS réellement posté sur le compte @" + config.author + "@" + process.env.INSTANCE_MASTODON + " =========== ") } else { console.log(" ") if (process.env.INSTANCE_MASTODON && tokenForAuthorIsPresentInDotEnv(config.author)) { let visibility = 'public'; let language = 'fr'; let sensitive = false; let accessToken = process.env['TOKEN_' + config.author.toUpperCase()] const masto = new Masto({ access_token: accessToken, api_url: process.env.INSTANCE_MASTODON + '/api/v1/', }); let params = { status: config.message, visibility, language, sensitive } if (config.cw) { params['spoiler_text'] = config.cw } if (config.scheduled_at && config.scheduled_at_bool) { let dateschedule = new Date(config.scheduled_at) params['scheduled_at'] = dateschedule.toISOString() } console.log(config) /** * envoi sans fichier joint */ if (!config.image) { if (config.reallySendPost) { masto.post('statuses', params).then(rep => { // console.log('rep', rep) console.log("posté, yay!") }, err => { console.error(err) }) } } /** * envoi avec fichier, * on doit d'abord faire un upload du fichier, * puis relier son id de media au nouveau post. */ if (config.image) { var id; console.log("envoi du média", config.image) // if(config.image === 'osm_default.jpg'){ // id = '108787661095227871'; // params.media_ids = [id] // masto.post('statuses', params).then(rep => { // console.log("posté avec l'image osm_default déjà enregistrée") // // console.log('rep', rep) // }, err => { // // console.error(err) // console.log("erreur T_T") // }) // // }else{ // upload new media return masto.post('media', {file: fs.createReadStream('assets/' + config.image)}) .then(resp => { id = resp.data.id; params.media_ids = [id] masto.post('statuses', params).then(rep => { // console.log('rep', rep) console.log("posté avec une nouvelle image, WOOT") }, err => { console.error(err) console.log("erreur T_T") }) }) } // } } else { console.error(`pas de token pour l'auteur "${config.author}" ou pas d'instance mastodon définie`) } } } /** * @name listFilesOfFolder * lister les noms de fichier que l'on peut publier dans un dossier. * retourne un tableau */ export function listFilesOfFolder(folderPath){ let filesNames = [] fs.readdirSync(folderPath).map(fileName => { return filesNames.push(fileName); }); return filesNames; } /** * @name initializeFolderForPictures * crée un dossier d'assets, avec ses sous dossiers not_published et published si ils manquent. * une fois que l'on prendra une image dans le dossier non publié, on la déplacera dans le dossier des images publées. */ export function initializeFolderForPictures(folderName){ try { if (!fs.existsSync(folderName)) { fs.mkdirSync(folderName); } } catch (err) { console.error(err); } } export function findFirstImageInContent(htmlContent){ let firstImgSource = '' let loadedHtmlCheerio = load(htmlContent) let imageObj = loadedHtmlCheerio(htmlContent).find('img').get() if($(imageObj) && $(imageObj).attr('src')){ firstImgSource = $(imageObj).attr('src') } return firstImgSource; }