-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcli.js
More file actions
137 lines (106 loc) · 3.98 KB
/
cli.js
File metadata and controls
137 lines (106 loc) · 3.98 KB
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
/*
Agenda:
1. Introducción de JS101
2. Live coding scrapping de DevDay (1 hora)
3. Codeo de CLI con documentación + ayuda de mentores (2 horas)
4. Live coding de toda la CLI (opcional: ultima media hora)
Wi-Fi:
- ID: Nerdearla Workshops
- Password: agarralapala
Links:
- Gitbook: http://bit.ly/js101nerdearla
Requisitos:
- Node.js: https://nodejs.org
*/
const axios = require('axios')
const cheerio = require('cheerio')
const ora = require('ora')
const fire = require('js-fire')
const DAYS = {
one: 'Día 1',
two: 'Día 2',
three: 'Día 3',
}
const ROOM_NAMES = {
cognizantRoom: 'Auditorio Cognizant/Despegar',
openQubeRoom: 'Auditorio openqube',
sysArmyRoom: 'Sala sysarmy, workshops',
}
const TALK_TYPE = {
'charlas técnicas': 'tecnica',
'rH (menos recursos': 'rrhh',
workshop: 'workshop',
}
const main = async () => {
// Creamos un array nerdearlaEvents para ir almacenando todos en este
const nerdearlaEvents = []
// Mostremos un spinner
const spinner = ora('Cargando data de Nerdearla 🚀').start()
// 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 = 'No 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 id = $(li)
.find('.session_content_wrapper')
.attr('data-expandid')
.replace('excerpt_', '')
const time = $(li)
.find('.session_start_time')
.text()
const title = $(li)
.find('.session_title')
.text()
const info = $(li)
.find('.session_speakers')
.text()
// Obtengamos el tipo de charla: técnica, rh, o workshop (este puede estar en el room (workshops) o bien en description)
const type = room === ROOM_NAMES.sysArmyRoom ? TALK_TYPE.workshop : TALK_TYPE[description]
// Guardamos estos datos en un objeto + el day, room, date y description que viven por fuera de esta función
const talk = { title, type, time, info, day, room, date }
// Insertamos estos datos en el array nerdearlaEvents
nerdearlaEvents.push(talk)
})
})
// Pausemos el spinner
spinner.stop()
// Ahora creamos el objeto de configuración para la CLI
const nerdearlaCli = {
// Podemos pedir a la CLI por los eventos en un día en particular: one, two, three
days: day => {
const parsedDay = DAYS[day]
const nerdearlaTalksByDay = nerdearlaEvents.filter(event => event.day === parsedDay)
if (!nerdearlaTalksByDay.length) return console.log('No hay charlas para tal día')
console.table(nerdearlaTalksByDay)
},
// Podemos pedirle a la CLI por un tipo de charla en particular: tecnica, rrhh, o workshop
talks: type => {
const nerdearlaTalksByType = nerdearlaEvents.filter(event => event.type === type)
if (!nerdearlaTalksByType.length) return console.log('No hay charlas de tal tipo')
console.table(nerdearlaTalksByType)
},
}
// Inicializamos la CLI
fire(nerdearlaCli)
}
main()