Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
bin
# Created by .ignore support plugin (hsz.mobi)
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm
Expand Down
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
all: favpost

favpost: go build -o bin/favpost ./cmd/favpost/favpost.go
Empty file added bin/.gitkeep
Empty file.
28 changes: 12 additions & 16 deletions main.go → cmd/favpost/favpost.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ import (
_ "github.com/go-sql-driver/mysql"
"github.com/kavu/go-resque"
_ "github.com/kavu/go-resque/godis"
"github.com/shiwork/favpost/config"
"github.com/shiwork/favpost/model"
"github.com/shiwork/favpost/server"
"../../favpost"
"github.com/simonz05/godis/redis"
"fmt"
"strconv"
Expand All @@ -23,7 +21,10 @@ import (
var confPath = os.Getenv("FAVPOST_CONFIG")

func main() {
conf, err := config.Parse(confPath)
confPath := flag.String("c", "", "configuration file path")
flag.Parse()

conf, err := favpost.Parse(*confPath)
if err != nil {
log.Fatal(err)
}
Expand All @@ -39,7 +40,7 @@ func main() {
anaconda.SetConsumerSecret(conf.Consumer.ConsumerSecret)

//var user_id = int64(90649479) // @shiwork
userRepos := model.GetUserRepository(db)
userRepos := favpost.NewUserRepository(db)

// enqueue
redisClient := redis.New("tcp:127.0.0.1:6379", 0, "")
Expand All @@ -48,7 +49,7 @@ func main() {
go func() {
for {
// 酷いけどとりあえず全ユーザーを取得して処理を回す
users := &[]model.User{}
users := &[]favpost.User{}
users, err = userRepos.GetAll()
// sleep 5min
for _, user := range *users {
Expand All @@ -59,16 +60,11 @@ func main() {

for _, tweet := range searchResult {
if len(tweet.Entities.Media) > 0 {
ftweet := model.Tweet{
Id: tweet.Id,
ScreenName: tweet.User.ScreenName,
}

tweetStore := model.GetTweetRepository(db)
exists, _ := tweetStore.Exists(ftweet)
tweetStore := favpost.NewTweetRepository(db)
exists, _ := tweetStore.Exists(tweet)
if !exists {
tweetStore.Add(ftweet)
model.SlackShare{conf.WebHookURL}.Share(tweet)
tweetStore.Add(tweet)
favpost.SlackShare{conf.WebHookURL}.Share(tweet)

// bot enqueue
_, err := botqueue.Enqueue("resque:queue:favpostbot", "Favpost", strconv.FormatInt(tweet.Id, 10), tweet.User.ScreenName)
Expand All @@ -87,5 +83,5 @@ func main() {
}
}()

server.Run(conf, db)
favpost.Run(conf, db)
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package persistence
package favpost

import (
"database/sql"
Expand Down
20 changes: 10 additions & 10 deletions config/config.go → favpost/config.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package config
package favpost

import (
"encoding/json"
Expand All @@ -11,21 +11,21 @@ type TwitterConsumer struct {
ConsumerSecret string `json:"consumer_secret"`
}

type AccessToken struct {
type TwitterAccessToken struct {
Token string `json:"token"`
Secret string `json:"secret"`
}

type FavPConfig struct {
Consumer TwitterConsumer `json:"twitter_consumer"`
AccessToken AccessToken `json:"access_token"`
WebHookURL string `json:"web_hook_url"`
DbDsn string `json:"db_dsn"`
TemplatePath string `json:"template_path"`
type FavPostConfig struct {
Consumer TwitterConsumer `json:"twitter_consumer"`
AccessToken TwitterAccessToken `json:"access_token"`
WebHookURL string `json:"web_hook_url"`
DbDsn string `json:"db_dsn"`
TemplatePath string `json:"template_path"`
}

func Parse(filename string) (FavPConfig, error) {
var config FavPConfig
func Parse(filename string) (FavPostConfig, error) {
var config FavPostConfig
jsonString, err := ioutil.ReadFile(filename)
if err != nil {
log.Println("Failed to read config file:", err)
Expand Down
18 changes: 18 additions & 0 deletions favpost/crawler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package favpost

import (
"github.com/ChimeraCoder/anaconda"
"net/url"
)

func CrawlTwitterFavorite(access_token string, access_token_secret string){
api := anaconda.NewTwitterApi(access_token, access_token_secret)
var values []string
values[0] = "200"
searchResult, _ := api.GetFavorites(url.Values{"count": values})

for _, tweet := range searchResult {
if len(tweet.Entities.Media) > 0 {
}
}
}
23 changes: 11 additions & 12 deletions server/server.go → favpost/server.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package server
package favpost

import (
"database/sql"
Expand All @@ -10,20 +10,19 @@ import (
"github.com/flosch/pongo2"
"github.com/garyburd/go-oauth/oauth"
"github.com/gorilla/sessions"
"github.com/shiwork/favpost/config"
"github.com/shiwork/favpost/model"
"github.com/zenazn/goji"
"github.com/zenazn/goji/web"
"gopkg.in/boj/redistore.v1"
)

var conf config.FavPConfig
var conf FavPostConfig
var db *sql.DB

func Run(conf config.FavPConfig, dbInstance *sql.DB) {
func Run(conf FavPostConfig, dbInstance *sql.DB) {
conf = conf
db = dbInstance
pongo2.DefaultSet.SetBaseDirectory(conf.TemplatePath)
pongo2.DefaultLoader.SetBaseDir(conf.TemplatePath)
pongo2.DefaultSet = pongo2.NewSet("default", pongo2.DefaultLoader)

goji.Get("/", Top)
goji.Get("/setting", Setting)
Expand Down Expand Up @@ -64,14 +63,14 @@ func Top(c web.C, w http.ResponseWriter, r *http.Request) {
return
}

repo := model.GetTweetRepository(db)
repo := NewTweetRepository(db)
tweets, err := repo.Find(20)
if err != nil {
fmt.Println(err)
}

if loginStatus {
repo := model.GetUserRepository(db)
repo := NewUserRepository(db)
user, _ := repo.Get(user_id.(int64))

// login済みの場合は設定画面に遷移
Expand All @@ -97,7 +96,7 @@ func Setting(c web.C, w http.ResponseWriter, r *http.Request) {
return
}

repo := model.GetUserRepository(db)
repo := NewUserRepository(db)
user, _ := repo.Get(user_id.(int64))

tpl.ExecuteWriter(pongo2.Context{"user": user}, w)
Expand Down Expand Up @@ -160,19 +159,19 @@ func LoginCallback(c web.C, w http.ResponseWriter, r *http.Request) {

user_id, _ := strconv.ParseInt(values["user_id"][0], 10, 64)

token := model.AccessToken{
token := AccessToken{
Id: user_id,
Token: values["oauth_token"][0],
Secret: values["oauth_token_secret"][0],
}
user := model.User{
user := User{
Id: user_id,
ScreenName: values["screen_name"][0],
AccessToken: token,
}

// save user and token
repo := model.GetUserRepository(db)
repo := NewUserRepository(db)
err = repo.Add(user)
if err != nil {
fmt.Println("Error: %v", err)
Expand Down
2 changes: 1 addition & 1 deletion model/share.go → favpost/share.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package model
package favpost

import (
"github.com/ChimeraCoder/anaconda"
Expand Down
85 changes: 85 additions & 0 deletions favpost/tweet_repository.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package favpost

import (
"database/sql"
"strconv"
"github.com/ChimeraCoder/anaconda"
)

type Tweet struct {
Id int64
ScreenName string
}

func (m *Tweet) URL() string {
return "http://twitter.com/" + m.ScreenName + "/status/" + strconv.FormatInt(m.Id, 10)
}

type TweetRepository struct {
db *sql.DB
}

func NewTweetRepository(db *sql.DB) *TweetRepository {
return &TweetRepository{db}
}

func (r *TweetRepository) Add(tweet anaconda.Tweet) error {
query := `INSERT INTO tweet (tweet_id, screen_name) VALUES (?, ?)`
_, err := r.db.Exec(query, tweet.Id, tweet.User.ScreenName)
if err != nil {
return err
}
return nil
}

func (r *TweetRepository) Exists(tweet anaconda.Tweet) (bool, error) {
query := `SELECT * FROM tweet WHERE tweet_id = ? LIMIT 1`
row := r.db.QueryRow(query, tweet.Id)
storeTweet := &Tweet{}
err := row.Scan(
&(storeTweet.Id),
&(storeTweet.ScreenName),
)

switch {
case err == sql.ErrNoRows:
return false, nil
case err != nil:
return false, err
default:
return true, nil
}
}

func (r *TweetRepository) Find(limit int) (*[]Tweet, error) {
if limit > 100 {
limit = 100
}
if limit < 0 {
limit = 1
}

query := `SELECT * FROM tweet ORDER BY tweet_id DESC LIMIT ?`
rows, err := r.db.Query(query, limit)

if err != nil {
return nil, err
}
defer rows.Close()

var tweets []Tweet
for rows.Next() {
tweet := &Tweet{}
err := rows.Scan(
&(tweet.Id),
&(tweet.ScreenName),
)
if err != nil {
continue
}

tweets = append(tweets, *tweet)
}

return &tweets, nil
}
2 changes: 1 addition & 1 deletion persistence/user.go → favpost/user_persistence.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package persistence
package favpost

import (
"database/sql"
Expand Down
15 changes: 7 additions & 8 deletions model/user.go → favpost/user_repository.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package model
package favpost

import (
"database/sql"
"github.com/shiwork/favpost/persistence"
"time"
)

Expand All @@ -23,14 +22,14 @@ type User struct {
}

type UserRepository struct {
userPers persistence.UserPersistence
tokenPers persistence.AccessTokenPersistence
userPers UserPersistence
tokenPers AccessTokenPersistence
}

func GetUserRepository(db *sql.DB) UserRepository {
return UserRepository{
userPers: persistence.UserPersistence{db},
tokenPers: persistence.AccessTokenPersistence{db},
func NewUserRepository(db *sql.DB) *UserRepository {
return &UserRepository{
userPers: UserPersistence{db},
tokenPers: AccessTokenPersistence{db},
}
}

Expand Down
Loading