<commit_before>#!/usr/bin/ruby
# -*- coding: utf-8 -*-

# Based on http://ltzz.info/alpha/twitter_kisei.html

require 'pp'
require 'logger'
require 'rubygems'
require 'bundler/setup'
require 'twitter'
require 'tweetstream'

class KiseiFinder

	class Account

		attr_reader :screen_name

		# セクション開始時間
		attr_reader :section_start

		# セクション内での投稿数
		attr_reader :post_count

		def initialize(screen_name, twitter)
			@screen_name = screen_name
			@twitter = twitter
			@newsection = false
			@logger = Logger.new(STDOUT)
		end

		def section_start=(value)
			raise StandardError unless value.kind_of?(Time)
			@section_start = value
		end

		def newpost(time)
			if @newsection
				# 新セクションの開始
				# ただしUserStreamはたまに変な値を送ってくるため注意
				# (本当は現在時刻から1分以内にされたもののみ許可とかにしたほうがいいと思う)
				@section_start = time
				@post_count = 1
				@logger.info("#{@screen_name}: Start new section #{@section_start} to #{section_end}")
			elsif @section_start == nil or @post_count == nil
				# セクションの開始時刻がわからないか、投稿数がわからない
				#reset
				@logger.info("#{@screen_name}: section_start or post_count are unknown")
			elsif time >= @section_start and time <= section_end
				# セクション時間内のpost
				@post_count += 1
				@logger.info("#{@screen_name}: Post #{section_end}")
			elsif time > section_end
				# section_endより後のpost
				# 新規セクションを開始する
				@section_start = time
				@post_count = 1
				@logger.info("#{@screen_name}: Start new section (over section_end) #{@section_start} to #{section_end}")
			end
		end

		# セクション終了時間
		def section_end
			# セクション開始時間の3時間後
			@section_start+(60*60*3)
		end

		# セクションの残り時間
		def remain_section
			Time.now-section_end
		end

		# セクションあたりの投速
		def post_speed
			post_count/(section_end-@section_start)
		end

		def reset
			posts = @twitter.user_timeline(@screen_name, :count => 3200)
			if posts[0].created_at < Time.now-(60*60*3)
				# 最新のpostが3時間より前の場合次がセクション開始になる
				@newsection = true
			else
				# 3時間以上時間を置いてされたpostを探す
				previous_created_at = posts[0].created_at
				found = nil
				puts previous_created_at
				(1..posts.length-1).each do |i|
					post = posts[i]
					if (previous_created_at-post.created_at).to_i > (60*60*3)
						found = i
						break
					end
					previous_created_at = post.created_at
				end
				if found
					# 見つけたので現在のセクションの開始時刻とpost数を取得
					section_posts = posts[0..(found%127)]
					#@section_start = section_posts.first.created_at
					#@post_count = section_posts.length
					@section_start = posts[found-1].created_at
					@post_count = found
					@logger.info("#{@screen_name}: Reset section #{@post_count} #{@section_start} to #{section_end}")
				else
					# 無いようであれば現在規制中と仮定し、127post前のpostを前回のセクション開始とする
					section_post = posts[126]
					@section_start = section_post.created_at
					@post_count = 127
				end
			end
		end

	end

	def initialize(options={})
		@client = Twitter::Client.new(
			:consumer_key => options[:consumer_key],
			:consumer_secret => options[:consumer_secret],
			:oauth_token => options[:access_token],
			:oauth_token_secret => options[:access_secret]
		)
		@stream = TweetStream::Client.new(
			:consumer_key => options[:consumer_key],
			:consumer_secret => options[:consumer_secret],
			:oauth_token => options[:access_token],
			:oauth_token_secret => options[:access_secret],
			:auth_method => :oauth
		)
		# after_postaddedにProcを渡しその中で規制リプライしたり、コマンド処理したりする。
		@after_postadded = options[:after_postadded]
		@users = {}
		options[:users].each do |screen_name|
			@users[screen_name] = Account.new(screen_name, @client)
			@users[screen_name].reset
		end
	end

	def self.start(options={})
		self.new(options).start
	end
	def start
		@stream.userstream do |status|
			if status.text and @users[status.user.screen_name]
				@users[status.user.screen_name].newpost(status.created_at)
				@after_postadded.call(@client, status, @users[status.user.screen_name]) if @after_postadded
			end
		end
	end

end

if $0 == __FILE__
	config = YAML.load(File.read("config.yaml"))
	KiseiSearch.start(
		:consumer_key => config["twitter"]["consumer_key"],
		:consumer_secret => config["twitter"]["consumer_secret"],
		:access_token => config["twitter"]["access_token"],
		:access_secret => config["twitter"]["access_secret"],
		:users => config["users"],
		:after_postadded => Proc.new do |twitter, tweet, account|
			puts "@#{account.screen_name} #{account.post_count}(#{account.post_speed.round}) #{account.section_end}"
		end
	)
end
<commit_msg>Fix a mistake<commit_after>#!/usr/bin/ruby
# -*- coding: utf-8 -*-

# Based on http://ltzz.info/alpha/twitter_kisei.html

require 'pp'
require 'logger'
require 'rubygems'
require 'bundler/setup'
require 'twitter'
require 'tweetstream'

class KiseiFinder

	class Account

		attr_reader :screen_name

		# セクション開始時間
		attr_reader :section_start

		# セクション内での投稿数
		attr_reader :post_count

		def initialize(screen_name, twitter)
			@screen_name = screen_name
			@twitter = twitter
			@newsection = false
			@logger = Logger.new(STDOUT)
		end

		def section_start=(value)
			raise StandardError unless value.kind_of?(Time)
			@section_start = value
		end

		def newpost(time)
			if @newsection
				# 新セクションの開始
				# ただしUserStreamはたまに変な値を送ってくるため注意
				# (本当は現在時刻から1分以内にされたもののみ許可とかにしたほうがいいと思う)
				@section_start = time
				@post_count = 1
				@logger.info("#{@screen_name}: Start new section #{@section_start} to #{section_end}")
			elsif @section_start == nil or @post_count == nil
				# セクションの開始時刻がわからないか、投稿数がわからない
				#reset
				@logger.info("#{@screen_name}: section_start or post_count are unknown")
			elsif time >= @section_start and time <= section_end
				# セクション時間内のpost
				@post_count += 1
				@logger.info("#{@screen_name}: Post #{section_end}")
			elsif time > section_end
				# section_endより後のpost
				# 新規セクションを開始する
				@section_start = time
				@post_count = 1
				@logger.info("#{@screen_name}: Start new section (over section_end) #{@section_start} to #{section_end}")
			end
		end

		# セクション終了時間
		def section_end
			# セクション開始時間の3時間後
			@section_start+(60*60*3)
		end

		# セクションの残り時間
		def remain_section
			Time.now-section_end
		end

		# セクションあたりの投速
		def post_speed
			post_count/(section_end-@section_start)
		end

		def reset
			posts = @twitter.user_timeline(@screen_name, :count => 3200)
			if posts[0].created_at < Time.now-(60*60*3)
				# 最新のpostが3時間より前の場合次がセクション開始になる
				@newsection = true
			else
				# 3時間以上時間を置いてされたpostを探す
				previous_created_at = posts[0].created_at
				found = nil
				puts previous_created_at
				(1..posts.length-1).each do |i|
					post = posts[i]
					if (previous_created_at-post.created_at).to_i > (60*60*3)
						found = i
						break
					end
					previous_created_at = post.created_at
				end
				if found
					# 見つけたので現在のセクションの開始時刻とpost数を取得
					section_posts = posts[0..(found%127)]
					#@section_start = section_posts.first.created_at
					#@post_count = section_posts.length
					@section_start = posts[found-1].created_at
					@post_count = found
					@logger.info("#{@screen_name}: Reset section #{@post_count} #{@section_start} to #{section_end}")
				else
					# 無いようであれば現在規制中と仮定し、127post前のpostを前回のセクション開始とする
					section_post = posts[126]
					@section_start = section_post.created_at
					@post_count = 127
				end
			end
		end

	end

	def initialize(options={})
		@client = Twitter::Client.new(
			:consumer_key => options[:consumer_key],
			:consumer_secret => options[:consumer_secret],
			:oauth_token => options[:access_token],
			:oauth_token_secret => options[:access_secret]
		)
		@stream = TweetStream::Client.new(
			:consumer_key => options[:consumer_key],
			:consumer_secret => options[:consumer_secret],
			:oauth_token => options[:access_token],
			:oauth_token_secret => options[:access_secret],
			:auth_method => :oauth
		)
		# after_postaddedにProcを渡しその中で規制リプライしたり、コマンド処理したりする。
		@after_postadded = options[:after_postadded]
		@users = {}
		options[:users].each do |screen_name|
			@users[screen_name] = Account.new(screen_name, @client)
			@users[screen_name].reset
		end
	end

	def self.start(options={})
		self.new(options).start
	end
	def start
		@stream.userstream do |status|
			if status.text and @users[status.user.screen_name]
				@users[status.user.screen_name].newpost(status.created_at)
				@after_postadded.call(@client, status, @users[status.user.screen_name]) if @after_postadded
			end
		end
	end

end

if $0 == __FILE__
	config = YAML.load(File.read("config.yaml"))
	KiseiFinder.start(
		:consumer_key => config["twitter"]["consumer_key"],
		:consumer_secret => config["twitter"]["consumer_secret"],
		:access_token => config["twitter"]["access_token"],
		:access_secret => config["twitter"]["access_secret"],
		:users => config["users"],
		:after_postadded => Proc.new do |twitter, tweet, account|
			puts "@#{account.screen_name} #{account.post_count}(#{account.post_speed.round}) #{account.section_end}"
		end
	)
end

{'fraction_non_alphanumeric': 0.12389780691838119, 'fraction_numerical': 0.01040018087271083, 'mean_word_length': 4.122756224667053, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 41, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1249348', 'n_tokens_mistral': 4077, 'n_tokens_neox': 3455, 'n_words': 574}