from time import sleep

sleep(5)
print("Dormiu por 5 segundos")

from time import gmtime
print(gmtime(0))

from time import time
print(time())

"""
Explanation: Desafio 3
1. Entender como funcionar o módulo time
Ver slide 49 e 50.
End of explanation
"""


import tweepy

consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''

autorizar = tweepy.OAuthHandler(consumer_key, consumer_secret)
autorizar.set_access_token(access_token, access_token_secret)

"""
Explanation: Referência e outros exemplos: https://docs.python.org/3/library/time.html
Além Da mesma forma que fizemos na API REST do Twitter, temos que salvar as chaves de acesso, bem como definir o objeto OAuthHandler para cuidar da autenticação e validação do acesso.
End of explanation
"""


class DadosPublicosTwitter(tweepy.StreamListener):
    def __init__(self, nome_arq, limite):
        self.tempo_inicial = time()
        self.limite = limite # 5 minutos == 300 segundos
        self.salvar_arquivo = open(nome_arq, 'a', newline='')
        
    def on_data(self, dados):
        if(time() - self.tempo_inicial < self.limite):
            self.salvar_arquivo.write(dados)            
            return True
        else:
            self.salvar_arquivo.close()
            return False

nome_arq = 'tweets_5min.json'
dados_twitter = DadosPublicosTwitter(nome_arq, 300)

fluxo = tweepy.Stream(autorizar, dados_twitter)

fluxo.filter(track=['Big Data'])

"""
Explanation: 2. Modificar nossa classe para ter duração de 5 minutos
Segue abaixo as soluções encontradas para os problemas do último desafio.
1) Falta fechar o arquivo e 2) Falta finalizar a execução do Streaming;
Para esses dois problemas conseguimos tratar dentro do método on_data. O retorno padrão da função é True, portanto enquanto não acontecer alguma ação que diga que não é mais True, o código irá recuperar dados.
Portanto, quando criamos a condição de parada (5 minutos), podemos retornar False, encerrando a execução do Streaming. Nessa mesma condição, antes do retorno, podemos fechar o arquivo. Como mostra o código abaixo.
python
if(time() - self.tempo_inicial &lt; self.limite):
    self.salvar_arquivo.write(dados)            
    return True
else:
    self.salvar_arquivo.close()
    return False
3) Cada tweet deve ficar em uma linha; Abra o arquivo tweets.json e veja que existe uma linha em branco entre os tweets salvos.
A função open tem um parâmetro chamado newline em que podemos definir como vazio, desta forma não teremos esse problema. Veja código abaixo:
python
open(nome_arq, 'a', newline='')
Bom, vamos ao código final agora.
End of explanation
"""


