Cómo utilizar la librería API NBA para realizar una aplicación con Mat|r Script

Buenas! Soy Mauricio García, especialista en Mat|r, y hoy vamos a ver cómo utilizar la librería “Api-NBA” que desarrollamos en el anterior post para realizar una aplicación utilizando Mat|r Script. 

 

Para ver el Post anterior pueden hacer click aquí.

 

Les comparto la Documentación de Mat|r Script que vamos a necesitar: 

 

Para comenzar tenemos que tener en mente qué clase de aplicación queremos desarrollar y cómo vamos a tener organizada la información, de manera que podamos ir visualizando las pantallas de la misma y la navegación que va a haber entre cada una. La librería “Api-NBA” nos otorga sólo información de la NBA, por lo tanto, vamos a desarrollar una aplicación informativa para el usuario: vamos a realizar una Aplicación que vaya de lo más general a lo más particular (Temporada/Liga > Partidos > Equipos > Jugadores).

 

Una vez planificada la aplicación, vamos a conseguir la Api Key para poder utilizar los Endpoints de la Librería. En la documentación de la misma nos dice cómo obtenerla: 

————————————————————————————-

Get a Key

Note: You need add a Credit Card to do the last step.

—————————————————————————————–

La Api Key aparece en el campo X-RapidAPI-Key: 

Una vez obtenida la Key podemos empezar a codear en Mat|r Script y desarrollar la Aplicación. 

Primero vamos a crear una constante de nombre “key” para alojar ahí nuestra Api Key, así si llegamos a compartir nuestra app para que otros usuarios puedan forkerarla no se les va a compartir esta constante.

Tambien importamos la librería “Api-NBA” en el código para poder utilizarla cuando la necesitemos. Esto lo realizaremos con la sentencia “Import nba as nbapi”, como se visualiza a continuación:

Vemos que en panel lateral derecho, en el tab ‘Libraries’, se muestra la librería importada. Podemos consultar ahí mismo la documentación y todo su contenido.

Para ir desde lo más general a lo particular en la pantalla principal tiene que tener un selector para Temporada y otro para Liga, le agregamos un botón que ejecutará la Rule de búsqueda de los partidos valores seleccionados. Para que podamos tener la última información de la NBA podemos hacer uso de los endpoints que nos traen los últimos partidos y los partidos en vivo, esta información podemos mostrarla en diferentes listas.

 

Experience Home {

    Array<String> seasons value([]) as Select

    Array<String> leagues value([]) as Select

    Decision btn2 action(‘HomeContext.leagueAndSeason’) label(‘League And Season Search’)

 

    String name label(“Live Matchs: “) as Label

    Array<Teams> live value([]) as List

    

    String lastMatch label(“Last Matches: “) as Label

    Array<Teams> lastMatches value([]) as List

}

Creamos un modelo de nombre Teams para guardar los datos de los partidos que se van a mostrar en las Listas y, de esta manera mostrarlos más fácilmente.

Para eso creamos un template de nombre “match” para que los datos se visualicen en las listas de la siguiente manera:

 

La pantalla, que ya creamos, va a ser nuestra pantalla principal en la aplicación. Para cargarle los datos vamos a crear una pantalla de carga así al usuario le mostramos la pantalla principal completa con todos los datos listos. Para ello, en otro file de Mat|r Script, vamos a escribir el código, para la precarga de los datos, en el ciclo de vida “OnCreate” de la Experiencia y al final vamos a pushear estos datos a la Experience de la pantalla principal “Home”. 

 

Experience Main {

    String text value(‘Upload Data’) as Label

    

    OnCreate {

        broker.ui.showLoading()

 

        // Live Match

  // Modelos de la Librería

        nbapi::Game responselive = nbapi::Game()

        nbapi::Season responseSeason = nbapi::Season()

        nbapi::League responseLeague = nbapi::League()

        Home h = Home() //Modelo de la Pantalla Principal

        Teams teamLive = Teams() //Modelo de para los partidos

 

        responselive = nbapi::NBAFunctions.getGamebyLive(key)

        if (responselive.api.games.size() != 0) {

            for game in responselive.api.games {

                teamLive.team1 = game.vTeam.nickName

                teamLive.logo1 = game.vTeam.logo

                teamLive.score1 = game.vTeam.score.points

                teamLive.team2 = game.hTeam.nickName

                teamLive.logo2 = game.hTeam.logo

                teamLive.score2 = game.hTeam.score.points                

                teamLive.gameID = game.gameId                

                h.live.add(teamLive)                

                teamLive = Teams()

            }            

            h.name = ‘Live Matchs: ‘

        } else {

            h.name = “There aren’t Matches at this time.”

        }

        

        // Last Matches

        Date date = Date()

        DateFormatter formatter = DateFormatter(format: ‘yyyy-MM-dd’)

        responselive = nbapi::Game()

        String day = formatter.stringFromDate(date)        

        responselive = nbapi::NBAFunctions.getGamebyDate(key, day)

        if (responselive.api.games.size() != 0) {

            for game in responselive.api.games {

                teamLive.team1 = game.vTeam.nickName

                teamLive.logo1 = game.vTeam.logo

                teamLive.score1 = game.vTeam.score.points                

                teamLive.team2 = game.hTeam.nickName

                teamLive.logo2 = game.hTeam.logo

                teamLive.score2 = game.hTeam.score.points                

                teamLive.gameID = game.gameId                

                h.lastMatches.add(teamLive)                

                teamLive = Teams()

            }

            h.lastMatch = “Last Matches: “

        } else {

            h.lastMatch = “Failed to load matches.”

        }

        

        // Seasons

        responseSeason = nbapi::NBAFunctions.getSeasons(key)

        if (responseSeason.api) {

            h.seasons = responseSeason.api.seasons

            h.seasons.unshift(‘Select a Season…’)

        } else {

            h.seasons.add(responseSeason.error)

        }

        

        // Leagues

        responseLeague = nbapi::NBAFunctions.getLeagues(key)

        if (responseLeague.api) {

            h.leagues = responseLeague.api.leagues

            h.leagues.unshift(‘Select a League…’)

        } else {

            h.leagues.add(responseLeague.error)

        }

        

        broker.ui.hideLoading()        

        broker.ui.push(‘Home’, h)

    }

}

 

  • Resaltado en Amarillo: Se puede ver en el código que utilizo las funciones de la librería para traer los datos y después los organizo para poder pushearlos a la experiencia Home. 
  • Resaltado Celeste: Esto es una función para poder pasar de un String a un Integer. La necesitamos para poder enviar los parámetros a los endpoints, ya que los endpoints nos devuelven Strings y algunos parámetros necesitamos enviarlos en Integer, estos son los id’s de los juegos, equipos y jugadores. Si quieren ver el código pueden forkear la aplicación desde el Hub o pueden ver el código usando el código de invitación: fwJwYmz8. Al final les dejo el Link.

 

Con esto ya tendríamos la primer pantalla lista, ahora tenemos que hacer que el usuario pueda interactuar con estos datos, en la Experiencia Home vamos a agregarles Rules en la parte de su contexto “RuleContext HomeContext”.

1. Para que el botón que tenemos en la experiencia ejecute la búsqueda de juegos por Temporada y Liga:

 

Rule leagueAndSeason {

        Home h = broker.ui.getDataSource()

        Games g = Games()

        nbapi::Game games = nbapi::Game()

 

        if ((h.seasons.get(h.seasons.selected().get(0)) != ‘Select a Season…’ && h.seasons.get(h.seasons.selected().get(0)) != ” && h.seasons.get(h.seasons.selected().get(0)) != null) && (h.leagues.get(h.leagues.selected().get(0)) != ‘Select a League…’ && h.leagues.get(h.leagues.selected().get(0)) != ” && h.leagues.get(h.leagues.selected().get(0)) != null)) {

                Teams team = Teams()

                Teams teamOld = Teams()

                Integer season = 0

                String league = ”

                

                season = changes.parseDouble(h.seasons.get(h.seasons.selected().get(0)))

                league = h.leagues.get(h.leagues.selected().get(0))

                games = nbapi::NBAFunctions.getGamebyLeague(key, league, season)

                

                if (games.api) {

                    broker.ui.showLoading() 

                    for game in games.api.games {

                        team.team1 = game.vTeam.nickName

                        team.logo1 = game.vTeam.logo

                        team.score1 = game.vTeam.score.points

                        team.team2 = game.hTeam.nickName

                        team.logo2 = game.hTeam.logo

                        team.score2 = game.hTeam.score.points

                        team.gameID = game.gameId

 

                        // Don’t show equals matchs

                        if (g.allTeams.size() > 0) {

                            if (teamOld.team1 != team.team1 && teamOld.team2 != team.team2 && teamOld.score1 != team.score1 && teamOld.score2 != team.score2) {

                                g.allTeams.add(team)

                                teamOld = team

                            }

                        } else {

                            g.allTeams.add(team)

                            teamOld = team

                        }

                        team = Teams()

                    } 

                    broker.ui.hideLoading()

                    broker.ui.push(‘Games’, g)

                }

        } else {

            broker.ui.showAlert(‘Empty Season or League.’, ‘You need selected a season and league.’)

        }

    }

2. Al seleccionar un juego de la Lista de “Last Matchs”, agregamos esta Rule como evento a la Lista desde el tab Builder UI, al seleccionar la lista e ir a las propiedades: 

 

Rule selectGame {

        Home h = broker.ui.getDataSource()

        GameDetails gameD = GameDetails()

        Teams match = Teams()

        nbapi::GameDetails matchDetail = nbapi::GameDetails()

        Integer id = 0

        match = h.lastMatches.get(h.lastMatches.selected().get(0))

        id = changes.parseDouble(match.gameID)

        matchDetail = nbapi::NBAFunctions.getGameDetails(key, id)

        try {

            for game in matchDetail.api.game {

                gameD.season = game.seasonYear

                gameD.league = game.league

                gameD.arena = game.arena

                gameD.city = game.city

                gameD.country = game.country

                gameD.startTime = game.startTimeUTC.substringFromIndex(game.startTimeUTC.indexOf(‘T’) + 1)

                gameD.startTime = gameD.startTime.substringToIndex(gameD.startTime.indexOf(‘.’) – 1)

                gameD.endTime = game.endTimeUTC.substringFromIndex(game.startTimeUTC.indexOf(‘T’) + 1)

                gameD.endTime = gameD.endTime.substringToIndex(gameD.endTime.indexOf(‘.’) – 1)

                gameD.team1ID = game.vTeam.teamId

                gameD.logo1 = game.vTeam.logo

                gameD.team1Name = game.vTeam.fullName + ‘-(‘ + game.vTeam.shortName + ‘)’

                gameD.nick1Name = match.team1

                gameD.score1 = game.vTeam.score.points

                gameD.linesScore1 = game.vTeam.score.linescore

                gameD.team2ID = game.hTeam.teamId

                gameD.logo2 = game.hTeam.logo

                gameD.team2Name = game.hTeam.fullName + ‘-(‘ + game.hTeam.shortName + ‘)’

                gameD.nick2Name = match.team2

                gameD.score2 = game.hTeam.score.points

                gameD.linesScore2 = game.hTeam.score.linescore

                for official in game.officials {

                    gameD.official.add(official.name)

                }

            }

            broker.ui.push(‘GameDetails’, gameD)

        } catch(e) {

            broker.ui.showAlert(“There isn’t data”, “The Match selected don’t have data.”)

        }

    }

 

  • Para la Rule 1) vamos a crear un archivo de Mat|r Script, llamado “games”, el cual va a ser una lista de juegos. En él solamente vamos a tener un atributo List que va a usar el template “match” para mostrar todos los partidos que devuelva la librería.

 

Experience Games {

    Array<Teams> allTeams value([])

    String name value(“Matches: “) as Label

    Array<Teams> teams value([]) as List

    Decision btn action(‘GamesContext.moreTeams’) label(‘See More…’)

    

    OnCreate {

        try {

            Games g = broker.ui.getDataSource()

            Array<Teams> push = []

            Integer count = 0            

            while(count < 10 ) {

                g.teams.add(g.allTeams.get(count))

                count = count + 1

            }

        } catch(e) {

            // code

        }

    }

}

Agregamos un botón que muestre de a 10 resultados, es para mejorar la velocidad de la aplicación ya que se traen muchos juegos. Si quieren ver el código pueden forkear la aplicación desde el Hub o pueden ver el código usando el código de invitación: fwJwYmz8. Al final les dejo el Link.

Acá también creamos una Rule que se ejecute al seleccionar un partido desde la Lista, esa se las dejo a ustedes o pueden ver el código después.

 

  • Para la Rule 2) y la Rule anterior que tienen que hacer vamos a crear un archivo de Mat|r Script ”gameDetails” para mostrar el detalle del juego que seleccionemos. 

En esta Experiencia o pantalla vamos a mostrar datos del juego y los equipos que participaron del mismo. En las Rules anteriores ya hemos precargado los datos para pushearlos directamente a esta Experiencia.

 

Experience GameDetails {

    String season as Label

    String league as Label

    String arena as Label

    String city as Label

    String country as Label

    String startTime as Label

    String endTime as Label

    Array<String> official value([]) as List

    

    String team1ID

    String logo1 as Image

    String team1Name as Label

    // String team1ShortName as Label

    String nick1Name as Label

    String score1 as Label

    Array<String> linesScore1 value([]) as List

    Decision players1 action(‘GameDetailsContext.selectTeam1’) label(‘Show Team’)

    

    String team2ID

    String logo2 as Image

    String team2Name as Label

    // String team2ShortName as Label

    String nick2Name as Label

    String score2 as Label

    Array<String> linesScore2 value([]) as List

    Decision players2 action(‘GameDetailsContext.selectTeam2’) label(‘Show Team’)  

}

Como pueden notar en el código de la experiencia GameDetails hay dos botones, estos son para mostrar el detalle del equipo que seleccionemos:

Para el primer Botón players1:

    Rule selectTeam1 {

        GameDetails gD = broker.ui.getDataSource()

        TeamDetails tD = TeamDetails()

        Integer id = changes.parseDouble(gD.team1ID)

        nbapi::Team t = nbapi::Team()        

        t = nbapi::NBAFunctions.getTeambyID(key, id)

        for teams in t.api.teams {

            // tD.nameTeam = teams.name

            tD.fullName = teams.fullName

            tD.nickName = gD.nick1Name

            tD.logo = teams.logo

            tD.shortName = teams.shortName

            tD.allStar = teams.allStar

            tD.nbaFranchise = teams.nbaFranchise

            tD.ligaConfName = teams.leagues.standard.confName

            tD.ligaDivName = teams.leagues.standard.divName

            tD.teamID = teams.teamId

        }        

        broker.ui.push(‘TeamDetails’, tD)

    }

Para el otro es lo mismo pero con 2 en las partes donde hay un 1.

 

Aquí tenemos que se pushean los datos a una Experiencia llamada ‘TeamDetails’, la cual está compuesta por la siguiente estructura: 

 

Experience TeamDetails {

    String fullName as Label

    String nickName as Label

    String logo as Image

    String shortName as Label

    String allStar as Label

    String nbaFranchise as Label

    String ligaConfName as Label

    String ligaDivName as Label    

    String teamID    

    Decision players action(‘TeamDetailsContext.showPlayers’) label(‘List Players’)

    Array<nbapi::Players> playerList value([]) as List 

}

 

El Botón que vemos en la experiencia es para llenar la lista que se encuentra debajo con los jugadores del equipo, para ello ejecuta la Rule showPlayers que utiliza una función de la librería para traerlos.

 

    Rule showPlayers {

        TeamDetails tD = broker.ui.getDataSource()

        nbapi::Player response = nbapi::Player()

        Integer id = changes.parseDouble(tD.teamID)

        tD.playerList = []

        

        response = nbapi::NBAFunctions.getPlayerbyTeamId(key, id)

        

        tD.playerList = response.api.players

    }

Por último creamos una Rule para que al seleccionar uno de los jugadores de la lista podamos ver datos del mismo. Esta Rule se las dejo a ustedes, en la librería está la función que sirve para esto. (Para esto van a tener que usar la función para transformar Strings en Integers, está en la app).

Esta Rule tiene que pushear los datos a un experiencia llamada players la cual puede tener el siguiente cuerpo: 

 

Experience Players {

    String name as Label

    String textYP value(‘Years of Professionalism: ‘) as Label

    String yearsPro as Label

    String textCN value(‘College Name: ‘) as Label

    String collegeName as Label

    String textC value(‘Country: ‘) as Label

    String country as Label

    String textBirth value(‘Date of Birth: ‘) as Label

    String dateOfBirth as Label

    String textA value(‘Affilliation: ‘) as Label

    String affilliation as Label

    String textSNBA value(‘Start NBA: ‘) as Label

    String startNba as Label

    String textH value(‘Height (Meters): ‘) as Label

    String heightInMeters as Label

    String textW value(‘Weight (Kilograms): ‘) as Label

    String weightInKilograms as Label

    String tittle value(‘Standard League: ‘) as Label

    String textJ value(‘Jersey: ‘) as Label

    String jersey as Label

    String textP value(‘Position: ‘) as Label    

    String pos as Label

    String textAct value(‘Active: ‘) as Label 

    String active as Label

    

    String teamId

    String playerId

}

 

Listo ya tendríamos una aplicación navegable y funcional que hace uso de una librería, sólo les queda hacerle la interfaz. Les dejo la aplicacion que yo cree y le agregué un par de cosas más.

 

    

Espero que les sirva y se enganchen con la programación en esta plataforma.

 

Saludos!