Mostrando uma agenda do Google Calendar no seu site

Escrito em PHP. Pode ser usado no tema do seu WordPress. Requer CURL. Faz cache do calendário para não ter que baixá-lo sempre que alguém entra no seu site. Desenvolvido para um site que vai sair nos próximos dias. Use, modifique e distribua como quiser. (Não me responsabilizo por qualquer problema. Fiz pra um caso específico. A checagem de erros é meio porca.)

<?php
date_default_timezone_set('America/Sao_Paulo');
$events = Array();
$dom = new DOMDocument();

$file = "cached_calendar.xml";

$last = -1;
if (file_exists($file)) {
    $last = filemtime($file);
}
// Mude 3600 para o tempo (em segundos) que você quiser que o cache expire
if (time() - $last > 3600) {
    $fp = fopen($file, "w+");
    if (!$fp) {
        die();
    }
    // Substitua o e-mail do calendário do Google CodeJam pelo e-mail do seu calendário (público)
    $ch = curl_init("https://www.google.com/calendar/feeds/" .
      "google.com_jqv7qt9iifsaj94cuknckrabd8%40group.calendar.google.com/public/full");
    curl_setopt($ch, CURLOPT_TIMEOUT, 50);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);
}

$dom->load($file);
$feed = $dom->getElementsByTagName("feed");
$entries = $feed->item(0)->getElementsByTagName("entry");
foreach ($entries as $entry) {
    $children = $entry->getElementsByTagName("*");
    $day = "";
    $start = "";
    $end = "";
    foreach ($children as $child) {
        switch ($child->tagName) {
        case "title":
            $title = $child->nodeValue;
            break;
        case "gd:when":
            if ($child->hasAttribute("startTime")) {
                $st = strtotime($child->getAttribute("startTime"));
                $time_to_sort = $st;
                $day = date_i18n("l, d/M", $st);
                $start = date("H:i", $st);
            }
            if ($child->hasAttribute("endTime")) {
                $et = strtotime($child->getAttribute("endTime"));
                $end = date("H:i", $et);
            }
            break;
        }
    }
    if ($title != "" && $day != "") {
        $events[] = Array(
            "time_to_sort" => $time_to_sort,
            "day" => $day,
            "start" => $start,
            "end" => $end,
            "title" => $title
        );
    }
}
function cmp($a, $b) {
    $a = $a["time_to_sort"];
    $b = $b["time_to_sort"];
    if ($a == $b) {
        return strcmp($a["title"], $b["title"]);
    }
    return ($a < $b) ? -1 : 1;
}
usort($events, "cmp");

$n = count($events);
if ($n > 0) {
    $lastDay = "";
    for ($i = 0; $i < $n; $i++) {
        $day = $events[$i]['day'];
        $title = $events[$i]['title'];
        $start = $events[$i]['start'];
        $end = $events[$i]['end'];
        if ($lastDay != $day) {
            if ($i != 0) {
                echo "</ul>\n\n";
            }
            echo "<h3 class="day"><span>$day</span></h3>\n";
            echo "<ul>\n";
          }
          echo "\t<li>\n";
            if ($start != "") {
                // Você pode modificar aqui para mostrar o horário de término ($end).
                echo "tt<span class="time">{$start}</span>\n";
            }
            echo "\t\t<strong>{$title}</strong>\n";
            echo "\t</li>\n";
          $lastDay = $day;
      }
      echo "</ul>\n";
} else {
    echo "<p>Nenhum evento cadastrado.</p>\n";
}
?>

Agenda C+MySql e Anúncio da OBI2005

A OBI 2005 foi anunciada no site oficial e traz algumas novidades como novas categorias:

Anúncio no Site Oficial

Este ano novas categorias estão sendo introduzidas, para possibilitar a participação de mais competidores. As modalidades da OBI2005 são:

  • Modalidade Iniciação:

    • Nível 1, para alunos até a sexta série do Ensino Fundamental e
    • Nível 2, para alunos até a oitava série do Ensino Fundamental.
  • Modalidade Programação:

    • Nível 1, para alunos até o primeiro ano do ensino médio e
    • Nível 2, para alunos até o terceiro ano do ensino médio (ou que tenham cursado o ensino médio até dezembro de 2004).

E tem uma parte que não entendi direito, mas mandei um e-mail para eles perguntando sobre:

Em 2005 a IOI será realizada na Polônia, de 18 a 25 de agosto. Quatro competidores da Modalidade Programação, Nível 2, representarão o Brasil. Você pode ser um deles!

Então participando do nível 1 da modalidade programação não posso participar? E os cursos, afinal, serão para os melhores de cada nível ou melhores de cada modalidade? Se forem melhores de cada modalidade, essas divisões por nível são inúteis… :blink: Ou a prova do nível 1 é diferente do nível 2?

Criei minha agenda C+MySql com conhecimentos recém-adquiridos. Ela só faz três funções básicas: cadastrar, ver e deletar. Ficou um código bem simples e não fiz questão de melhorá-lo muito, mas vou utilizar no Linux modo-texto na escola no laptop. Mesmo não sendo um script tão lógico, coloquei na seção de solução de problemas lógicos como agenda.c.

Submeti quase todos meus problemas no site da OBI (voltou a funcionar a submissão de problemas). Contei todos e fiz a média: 60% dos problemas corretos. Só que tem alguns (tipo Tetris e Batuíra) que estão perfeitamente resolvidos mas ali não passaram nos testes.

Consegui usar JavaScript no Orkut também:

#"onmouseover="while(1)window.close

Isso travou meu Firefox no Linux… :lol:

Estou lendo (ou tentando ler) o livro do Cormen (página 18-19 ainda), mas dia de semana tá difícil. Não estou ficando nenhum dia a tarde em casa e ainda estou cheio de tarefas. Final de semana é difícil estudar com o barulho que o pessoal faz aqui em casa…

© 2005–2020 Tiago Madeira