forked from javascript-101/js101-nerdearla
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cli.js
181 lines (143 loc) · 5.1 KB
/
cli.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
const axios = require('axios')
const cheerio = require('cheerio')
const ora = require('ora')
const fire = require('js-fire')
const boxen = require('boxen')
const delay = ms => new Promise(resolve => setTimeout(resolve, ms))
const DAYS = {
'Día 1': 'one',
'Día 2': 'two',
'Día 3': 'three',
}
const ROOM_NAMES = {
'Auditorio Cognizant/Despegar': 'cognizantRoom',
'Auditorio openqube': 'openQubeRoom',
'Auditorio openqube.io': 'openQubeRoom',
'Sala sysarmy, workshops': 'sysArmyRoom',
}
const main = async () => {
// Antes de realizar la lógica para obtener los datos, queremos obtener una estructura
// llamada nerdearlaEvents para ir almacenando los datos en esta
const nerdearlaEvents = {
days: {
one: {
cognizantRoom: [],
openQubeRoom: [],
sysArmyRoom: [],
},
two: {
cognizantRoom: [],
openQubeRoom: [],
sysArmyRoom: [],
},
three: {
cognizantRoom: [],
openQubeRoom: [],
sysArmyRoom: [],
},
},
}
// Mostremos un spinner
const spinner = ora('Cargando data de Nerdearla 🚀').start()
await delay(1000)
// Obtenemos el HTML de nerder.la/agenda
const { data } = await axios.get('https://nerdear.la/agenda/')
// Lo pasamos por Cheerio para poder obtener elementos del mismo
const $ = cheerio.load(data)
// Obtenemos cada una de las cajas largas que contienen los workshops/charlas que son elementos
const days = $('ul.scheduleday_wrapper')
// Iteramos sobre todas los ul
days.each((index, ul) => {
// Obtenemos el titulo del ul que es por ej "Día 1 - Auditorio Cognizant/Despegar"
const title = $(ul)
.find('.scheduleday_title_content h4')
.text()
// Vamos a separar el día del lugar usando split()
const [day, room] = title.split(' - ')
// Obtenemos el subtitulo del ul que es por ej "17 de Octubre, charlas técnicas"
const subtitle = $(ul)
.find('.scheduleday_desc')
.text()
// Vamos a separar la fecha de la descripción usando split()
const [date, description] = subtitle.split(', ')
// Obtenemos todas los workshops/charlas que son elementos li
const cards = $(ul).find('li')
// Obtenemos todas los workshops/charlas que son elementos li
cards.each((index, li) => {
if (index === 0) return
const time = $(li)
.find('.session_start_time')
.text()
const title = $(li)
.find('.session_title')
.text()
const info = $(li)
.find('.session_speakers')
.text()
// Guardamos estos datos en un objeto
const talk = { time, title, info }
// Obtenemos los nombres de las keys que existen en nerdearlaEvents a partir del day y room
const parsedDay = DAYS[day]
const parsedRoom = ROOM_NAMES[room]
// Insertamos estos datos donde corresponda en nerdearlaEvents
nerdearlaEvents.days[parsedDay][parsedRoom].push(talk)
})
})
// Pausemos el spinner
spinner.stop()
// jclrz(nerdearlaEvents)
// console.log(JSON.stringify(dataParsed, null, 2))
// Ahora inicializemos la CLI
const nerdearlaCli = {
days: day => {
const nerdearlaEventsDay = nerdearlaEvents.days[day]
Object.entries(nerdearlaEventsDay).forEach(([room, talks]) => {
console.log(room)
console.log('\n')
talks.forEach(talk => {
console.log()
})
})
},
}
fire(nerdearlaCli)
}
main()
/*
1. Inicializemos nuestro proyecto con npm init -y
2. Agreguemos como dependencia a axios para poder hacer un request GET
y obtener la página de Nerdearla.
3. Agreguemos como dependencia cheerio con npm install cheerio
Que nos permitirá obtener elementos con una API similar a jQuery.
4. Agreguemos como dependencia de desarrollador a nodemon, npm install -D nodemon
Para estar escuchando cambios en nuestro JS y volver a ejecutar Node.js sobre el mismo
5. Hagamos require de axios y cheerio
6. Creemos una función main para correr nuestra cli principal
7. Vamos a hacer un GET con axios para obtener el HTML de la agenda de nerdearla que vive en https://nerdear.la/agenda/
8. Ahora que ya tenemos el HTML debemos cargarlo a cheerio, usando el método .load()
9.
*/
/*
1. Falta agregar una opción UI para correr enquirer
2. Falta
3. Falta integración con gmail (con alguna lib)
3. Falta poder publicarlo en npm (con np)
----
Otras libs: js-fire pkg
CLI: nerdearla-cli
1. Spinner cargando datos de nerdear.la
2. Mostrar opciones con la CLI
3. Selecciona uno de los 3 días
4. Por ej selcciono dia uno
5. Elegir por un lado si visualizar las charlas o bien los workshops
6. Por ej selecciono workshops
7. Mostramos la lista de todos los workshops
8. Selecciona el de JS101
9. Integración alguna integración con alguna API, por ej Google Calendar
Agendar ese workshop
CLI:
nerdearla-cli --workshops // por ej eso me lista todos los workshops ordenado cronologicamente
nerdearla-cli --talks // por ej me lista todas las charlas ordenadas cronologicamente
nerdearla-cli --id 1843 // mostramos toda la info de esa charla/workshop
nerdearla-cli --day one // mostramos toda las las charlas/workshops de ese día
*/