diaspora/lib/diaspora/user/connecting.rb

113 lines
3.9 KiB
Ruby

# Copyright (c) 2010, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
module Diaspora
module UserModules
module Connecting
def send_contact_request_to(desired_contact, aspect)
contact = Contact.new(:person => desired_contact,
:user => self,
:pending => true)
contact.aspects << aspect
if contact.save!
request = contact.dispatch_request
request
else
nil
end
end
def accept_contact_request(request, aspect)
activate_contact(request.sender, aspect)
if notification = Notification.where(:target_id=>request.id).first
notification.update_attributes(:unread=>false)
end
request.destroy
request.reverse_for(self)
end
def dispatch_contact_acceptance(request, requester)
Postzord::Dispatch.new(self, request).post
request.destroy unless request.sender.owner
end
def accept_and_respond(contact_request_id, aspect_id)
request = Request.where(:recipient_id => self.person.id, :id => contact_request_id).first
requester = request.sender
reversed_request = accept_contact_request(request, aspects.where(:id => aspect_id).first )
dispatch_contact_acceptance reversed_request, requester
end
def ignore_contact_request(contact_request_id)
request = Request.where(:recipient_id => self.person.id, :id => contact_request_id).first
request.destroy
end
def receive_contact_request(contact_request)
#response from a contact request you sent
if original_contact = self.contact_for(contact_request.sender)
receive_request_acceptance(contact_request, original_contact)
#this is a new contact request
elsif contact_request.sender != self.person
if contact_request.save!
Rails.logger.info("event=contact_request status=received_new_request from=#{contact_request.sender.diaspora_handle} to=#{self.diaspora_handle}")
end
else
Rails.logger.info "event=contact_request status=abort from=#{contact_request.sender.diaspora_handle} to=#{self.diaspora_handle} reason=self-love"
return nil
end
contact_request
end
def receive_request_acceptance(received_request, contact)
contact.pending = false
contact.save
Rails.logger.info("event=contact_request status=received_acceptance from=#{received_request.sender.diaspora_handle} to=#{self.diaspora_handle}")
received_request.destroy
self.save
end
def disconnect(bad_contact)
person = bad_contact.person
Rails.logger.info("event=disconnect user=#{diaspora_handle} target=#{person.diaspora_handle}")
retraction = Retraction.for(self)
retraction.subscribers = [person]#HAX
Postzord::Dispatch.new(self, retraction).post
remove_contact(bad_contact)
end
def remove_contact(contact)
bad_person_id = contact.person_id
posts = contact.posts.all
contact.destroy
posts.each do |post|
if post.user_refs < 1
post.destroy
end
end
end
def disconnected_by(person)
Rails.logger.info("event=disconnected_by user=#{diaspora_handle} target=#{person.diaspora_handle}")
if contact = self.contact_for(person)
remove_contact(contact)
elsif request = Request.where(:recipient_id => self.person.id, :sender_id => person.id).first
request.delete
end
end
def activate_contact(person, aspect)
new_contact = Contact.create!(:user => self,
:person => person,
:aspects => [aspect],
:pending => false)
end
end
end
end